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 ...
随机推荐
- WPF资源字典的使用【转】
资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1. 创建资源字典 创建资源字典的过程比较简单,只 ...
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- qthread 使用 signal 方法通信
因为之间尝试过的 signal 机制,都是在 emit singnal_my() 的地方,直接调用了 slot 函数:相当于,slot 只是一个回调函数. 所以,在这里有点困惑,如果是要顺序执行完 s ...
- angularjs中ckeditor的destroy问题
项目中,在切换了页面的tab页后会发现上传图片的操作报错,检查后发现问题根源是切换了tab页重新加载页面时ckeditor又会创建一次,这个时候的ckeditor已经不是第一次创建的那个了,所以上传图 ...
- SourceTree推送时,增加额外的远程仓库,不用每次都自定义粘贴复制网络
一.命令行添加 二.软件界面可以查看到结果 更新,以上是代码添加了远程仓库,最近,找到了不用代码,直接在文件夹里写地址来添加的方式.直接上图了.
- MyBatis源码分析(1)——整体依赖关系图
后续补充更新
- [NHibernate]存储过程的使用(一)
目录 写在前面 文档与系列文章 Nhibernate中使用存储过程 一个例子 总结 写在前面 上篇文章一个小插曲,分析了延迟加载是如何解决N+1 select查询问题的.这篇开始介绍在nhiberna ...
- 关于js中的时间处理
关于js编程, 主要是, 绝大部分是用 jquery. 但是, js原生的一些方法和属性也是要掌握的, 这个只是在 遇到的时候, 记一下就好了, 如: event的relatedTarget属性: 主 ...
- 10W -python
计算2 3 4 加运算符 小于30 >>> new=[''.join(('2',op,'3')) for op in ops] >>> print(new) ['2 ...
- PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展?
在虚拟机的CentOS5.5中,一键安装了PHP运行环境,但发现并没有 soap 扩展,而近期项目用需要用到 webservice. 上述的一键安装(lamp0.4),其实是源码编译安装,PHP配置文 ...