C#回顾 - 8.利用反射动态创建对象
- var data = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>";
- /// <summary>
- /// 消息类型枚举
- /// </summary>
- public enum MsgType
- {
- /// <summary>
- /// 文本消息
- /// </summary>
- TEXT,
- /// <summary>
- /// 图片消息
- /// </summary>
- IMAGE,
- /// <summary>
- /// 语音消息
- /// </summary>
- VOICE,
- /// <summary>
- /// 视频消息
- /// </summary>
- VIDEO,
- /// <summary>
- /// 小视频消息
- /// </summary>
- SHORTVIDEO,
- /// <summary>
- /// 地理位置消息
- /// </summary>
- LOCATION,
- /// <summary>
- /// 链接消息
- /// </summary>
- LINK,
- /// <summary>
- /// 事件类型
- /// </summary>
- EVENT
- }
- public abstract class BaseMsg
- {
- /// <summary>
- /// 开发者微信号
- /// </summary>
- public string ToUserName { get; set; }
- /// <summary>
- /// 发送方帐号(一个OpenID)
- /// </summary>
- public string FromUserName { get; set; }
- /// <summary>
- /// 消息创建时间 (整型)
- /// </summary>
- public string CreateTime { get; set; }
- /// <summary>
- /// 消息类型
- /// </summary>
- public MsgType MsgType { get; set; }
- }
- /// <summary>
- /// 文本消息类型(例外)
- /// </summary>
- public class MsgText : BaseMsg
- {
- /// <summary>
- /// 文本消息内容
- /// </summary>
- public string Content { get; set; }
- /// <summary>
- /// 消息Id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- }
- /// <summary>
- /// 图片消息类型(例外)
- /// </summary>
- public class MsgImage : BaseMsg
- {
- /// <summary>
- /// 图片链接
- /// </summary>
- public string PicUrl { get; set; }
- /// <summary>
- /// 消息Id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- /// <summary>
- /// 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
- /// </summary>
- public string MediaId { get; set; }
- }
- /// <summary>
- /// 语音消息类型(例外)
- /// </summary>
- public class MsgVoice : BaseMsg
- {
- /// <summary>
- /// 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
- /// </summary>
- public string MediaId { get; set; }
- /// <summary>
- /// 语音格式,如amr,speex等
- /// </summary>
- public string Format { get; set; }
- /// <summary>
- /// 消息id,64位整型
- /// </summary>
- public string MsgID { get; set; }
- }
- /// <summary>
- /// 视频消息类型(例外)
- /// </summary>
- public class MsgVideo : BaseMsg
- {
- /// <summary>
- /// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据
- /// </summary>
- public string MediaId { get; set; }
- /// <summary>
- /// 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
- /// </summary>
- public string ThumbMediaId { get; set; }
- /// <summary>
- /// 消息id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- }
- /// <summary>
- /// 小视频消息类型(例外)
- /// </summary>
- public class MsgShortVideo : BaseMsg
- {
- /// <summary>
- /// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据
- /// </summary>
- public string MediaId { get; set; }
- /// <summary>
- /// 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
- /// </summary>
- public string ThumbMediaId { get; set; }
- /// <summary>
- /// 消息id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- }
- /// <summary>
- /// 地理位置消息类型(例外)
- /// </summary>
- public class MsgLocation : BaseMsg
- {
- /// <summary>
- /// 地理位置维度
- /// </summary>
- public string Location_X { get; set; }
- /// <summary>
- /// 地理位置经度
- /// </summary>
- public string Location_Y { get; set; }
- /// <summary>
- /// 地图缩放大小
- /// </summary>
- public string Scale { get; set; }
- /// <summary>
- /// 地理位置信息
- /// </summary>
- public string Label { get; set; }
- /// <summary>
- /// 消息id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- }
- /// <summary>
- /// 链接消息类型(例外)
- /// </summary>
- public class MsgLink : BaseMsg
- {
- /// <summary>
- /// 消息标题
- /// </summary>
- public string Title { get; set; }
- /// <summary>
- /// 消息描述
- /// </summary>
- public string Description { get; set; }
- /// <summary>
- /// 消息链接
- /// </summary>
- public string Url { get; set; }
- /// <summary>
- /// 消息id,64位整型
- /// </summary>
- public string MsgId { get; set; }
- }
- public static BaseMsg LoadMsg()
- {
- var data = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>";
- var doc = XElement.Parse(data);
- MsgType msgtype = (MsgType)Enum.Parse(typeof(MsgType), doc.Element("MsgType").Value.ToUpper());
- //MsgType msgtype = (MsgType)Enum.Parse(typeof(MsgType), "TEXT");
- switch (msgtype)
- {
- case MsgType.IMAGE:
- return ConvertObj<MsgImage>(data);
- case MsgType.LINK:
- return ConvertObj<MsgLink>(data);
- case MsgType.LOCATION:
- return ConvertObj<MsgLocation>(data);
- case MsgType.VIDEO:
- return ConvertObj<MsgVideo>(data);
- case MsgType.SHORTVIDEO:
- return ConvertObj<MsgShortVideo>(data);
- case MsgType.TEXT:
- return ConvertObj<MsgText>(data);
- case MsgType.EVENT:
- return null;
- default:
- return ConvertObj<BaseMsg>(data);
- }
- }
- public static T ConvertObj<T>(string xmlstr)
- {
- try
- {
- var xml = XElement.Parse(xmlstr);
- var type = typeof(T);
- var t = Activator.CreateInstance<T>(); //动态创建实例,相当于 new T()
- var tousername = type.GetProperty("ToUserName");//搜索具有指定名称的公共属性
- //PropertyInfo.SetValue(object obj, object value, object[] index)
- tousername.SetValue(t, Convert.ChangeType(xml.Element("ToUserName").Value, tousername.PropertyType), null);
- xml.Element("ToUserName").Remove();
- var fromusername = type.GetProperty("FromUserName");
- fromusername.SetValue(t,
- Convert.ChangeType(xml.Element("FromUserName").Value, fromusername.PropertyType), null);
- xml.Element("FromUserName").Remove();
- var createtime = type.GetProperty("CreateTime");
- createtime.SetValue(t, Convert.ChangeType(xml.Element("CreateTime").Value, createtime.PropertyType), null);
- xml.Element("CreateTime").Remove();
- var msgType = type.GetProperty("MsgType");
- var msgtype = xml.Element("MsgType").Value;
- //msgType.SetValue() 是枚举,参数要改变
- msgType.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), msgtype.ToUpper()), null);
- xml.Element("MsgType").Remove();
- foreach (var element in xml.Elements())
- {
- var pr = type.GetProperty(element.Name.ToString());
- pr.SetValue(t, Convert.ChangeType(element.Value, pr.PropertyType), null);
- }
- return t;
- }
- catch (Exception)
- {
- return default(T);
- throw;
- }
- }
C#回顾 - 8.利用反射动态创建对象的更多相关文章
- C# 利用反射动态创建对象——带参数的构造函数和String类型
C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...
- C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)
最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好,特别是当构造函数带参数的时候.MSDN上给出的例子十分复杂,网上的 ...
- C# 利用反射动态创建对象[摘录]
摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...
- 【转】C# 利用反射动态创建对象
http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...
- C# 利用反射动态加载dll
笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...
- C# 知识点笔记:IEnumerable<>的使用,利用反射动态调用方法
IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...
- .Net Core利用反射动态加载类库的方法(解决类库不包含Nuget依赖包的问题)
在.Net Framework时代,生成类库只需将类库项目编译好,然后拷贝到其他项目,即可引用或动态加载,相对来说,比较简单.但到了.Net Core时代,动态加载第三方类库,则稍微麻烦一些. 一.类 ...
- protobuf在java应用中通过反射动态创建对象(DynamicMessage)
---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(...),这样就要求服务器在接 ...
- StructureMap.dll 中的 GetInstance 重载 + 如何利用 反射动态创建泛型类
public static T GetInstance<T>(ExplicitArguments args); // // Summary: // Creates a new instan ...
随机推荐
- datatable刷新表头
使用jQuery的datatable生成表格数据,当需要改变表头时,调用Table.fnDestroy();再重新创建表头 var oTable = null; function initSettin ...
- eclipse注释快捷键(含方法注释)
整段注释: /*public boolean executeUpdate(String sql) { System.out.println(sql); boolean mark=false; try ...
- Nginx简易配置文件(二)(反向代理)
user nobody nobody; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; events { use e ...
- oracle中将自建用户下的所有表删除
select 'drop table '||table_name||' ;' from user_tables;select 'drop sequence '||sequence_name||' ;' ...
- ionic 白屏
昨天在发布新app的时候发现app在高版本的android的时候发现没有问题,在低版本的android 的时候发现存在白屏的情况,在run中alert,不能弹框,run不能运行, 参考这篇文章 ht ...
- Windows7微软官方原版镜像系统文件
Windows7微软官方原版镜像系统 Windows 7 是由微软公司(Microsoft)开发的操作系统,核心版本号为Windows NT 6.1.Windows 7可供家庭及 商业工作环境.笔记本 ...
- 10月28日PHP基础知识测试题
本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数 ...
- Matlab中double,im2double,mat2gray区别
转载:http://blog.sina.com.cn/s/blog_6c41e2f30101559d.html ****************假设某图像数据A(uint8格式)*********** ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- tyvj1203 机器分配
描述 总公司拥有高效生产设备M台,准备分给下属的N个公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M<=100,N& ...