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 ...
随机推荐
- 解决Xamarin Android墙的问题
Xamarin Android项目在编译时会从google的服务器下载缺失的m2repository相关文件,虽然不明白这是干什么的,但是情况就是Andorid SDK Manager不会去下载这个东 ...
- jQuery之XML的加载和解析
1.XML(eXtensible Markup Language)即可扩展标记语言,与HTML一样,都是SGML标准通用语言.语法如下: 任何起始标签都必须有一个结束标签. 可以采用另一种简化语法,即 ...
- js判断用户的浏览设备是移动设备还是PC
<script type="text/javascript"> function browserRedirect() { var sUserAgent = naviga ...
- cookie 和session 的区别详解
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 【CityHunter】游戏流程设计及技术要点
目前CityHunter的核心玩法和主要的技术实现点已经全部到位,但是本人并未真正设计过整个游戏系统,所以只能循规蹈矩的先从最基本的流程图开始规划. 以上的流程是打开游戏直到控制台,接下来,是从控制台 ...
- 非对称加密算法——RSA
RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和L ...
- mysql索引失效
在做项目的过程中,难免会遇到明明给mysql建立了索引,可是查询还是很缓慢的情况出现,下面我们来具体分析下这种情况出现的原因及解决方法 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: ...
- centos 7.0 nginx 1.7.9成功安装过程
centos 7.0根目录 的目录构成 [root@localhost /]# lsbin dev home lib64 mnt proc run srv tmp varboot etc lib me ...
- QT C1041错误
使用QT Createor + MSVC2013写程序时.我复制了一份之前OK的代码到新的工程中,工程名字和之前的工程一样,出现了奇怪的错误.开始程序总是崩溃,后来我删掉shadow build目录, ...