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 ...
 
随机推荐
- Scrapy的中Css 选择器
			
//通过 名为 video_part_lists 的Class 中下面的 li 标签 liList = response.css('.video_part_lists li') for li in l ...
 - 使用腾讯开发平台获取QQ用户数据资料
			
<今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...
 - UIActivityViewController 系统社交化 共享
			
1.UIActivityViewController是继承自UIViewController,是拥有VC的特性 a.初始化 init , initWithActivityItems:applicat ...
 - ID还是普通字段做外键合适?
			
ORACLE:USER表中没有ID字段,只有USERNAME做为一个唯一一字段当主键, COMMENT评论表中有一个user表的外键是用了USER表中的USERNAME字段. 我总认为这不合理,一般情 ...
 - 浅谈CSRF攻击方式
			
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...
 - HTML5本地存储——IndexedDB(一:基本使用)
			
在HTML5本地存储——Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...
 - Html中<a>标签的样式的设置
			
html中<a>标签的样式的设置.. ------------------------ <html> <head> <title>这是网页选项卡的名称& ...
 - php htmlentities函数的问题
			
看到在细说php第二版教程中的函数htmlentities 例子,实际实验没有效果 $str = "一个 'quote' 是<b>bold</b>";ech ...
 - ubuntu 15.10安装并配置samba
			
1.安装samba apt-get install samba 2.vim /etc/samba/smb.conf 在文件结尾添加如下行 [share]path = /home/ihibinavail ...
 - python基础知识
			
由于python的灵活性,赋值前无需强调变量的数据类型,并且变量的数据类型在后期的操作过程中还可以改变,故不介绍关键字,直接定义方法及可以调用的方法. I 基本数据类型 一.字符串 1.使用单引号或 ...