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 ...
随机推荐
- XStream简单入门
简单的讲,XStream 涉及的就五个知识点:详情参考 官网 混叠,注解,转换器,对象流和操作json! 下面就用几个简单的例子来实现上述五个知识点! 基本步骤: 第1步:创建XStream对象. 通 ...
- svg格式嵌入html中方法之一
如下为html中主要代码,这里用img标签嵌入的. <div class="con-left-logo_svg"> <img src="images/l ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- AI贪吃蛇(二)
前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...
- HDU1086You can Solve a Geometry Problem too(判断线段相交)
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- Character类
Character类 用来判断大小写 方法: public static boolean isUpperCase(char ch):判断是否大写 public static boolean isLow ...
- C#------接口的理解
转载: http://blog.jobbole.com/85751/
- [Unity3D]添加音效说明
添加音效组件并添加音乐资源 其中Pitch用来提高和降低音调的,比如可以和赛车游戏的轮胎绑定,当轮胎越快,则音调越高 2D/3D音效:2D音效和摄影家的距离无关,可以看做是一个背景音乐:而3D音效则是 ...
- js 时间相关函数
实例: <!doctype html> <html> <head> <meta charset="utf-8"> <title ...
- Qt、VTK配置常见问题
QVTKWidget undefined reference to 问题,一定要在pro文件中添加库 libvtkGUISupportQt-6.3. 2. CMAKE_MAKE_PROGRAM ...