拿微信消息返回的示例数据实验
  1. 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>";

创建一个消息枚举
  1. /// <summary>
  2. /// 消息类型枚举
  3. /// </summary>
  4. public enum MsgType
  5. {
  6. /// <summary>
  7. /// 文本消息
  8. /// </summary>
  9. TEXT,
  10. /// <summary>
  11. /// 图片消息
  12. /// </summary>
  13. IMAGE,
  14. /// <summary>
  15. /// 语音消息
  16. /// </summary>
  17. VOICE,
  18. /// <summary>
  19. /// 视频消息
  20. /// </summary>
  21. VIDEO,
  22. /// <summary>
  23. /// 小视频消息
  24. /// </summary>
  25. SHORTVIDEO,
  26. /// <summary>
  27. /// 地理位置消息
  28. /// </summary>
  29. LOCATION,
  30. /// <summary>
  31. /// 链接消息
  32. /// </summary>
  33. LINK,
  34. /// <summary>
  35. /// 事件类型
  36. /// </summary>
  37. EVENT
  38. }

因为消息类型的大多数属性都相同,创建一个基类
  1. public abstract class BaseMsg
  2. {
  3. /// <summary>
  4. /// 开发者微信号
  5. /// </summary>
  6. public string ToUserName { get; set; }
  7. /// <summary>
  8. /// 发送方帐号(一个OpenID)
  9. /// </summary>
  10. public string FromUserName { get; set; }
  11. /// <summary>
  12. /// 消息创建时间 (整型)
  13. /// </summary>
  14. public string CreateTime { get; set; }
  15. /// <summary>
  16. /// 消息类型
  17. /// </summary>
  18. public MsgType MsgType { get; set; }
  19. }

再创建相应缺少类的属性
  1. /// <summary>
  2. /// 文本消息类型(例外)
  3. /// </summary>
  4. public class MsgText : BaseMsg
  5. {
  6. /// <summary>
  7. /// 文本消息内容
  8. /// </summary>
  9. public string Content { get; set; }
  10. /// <summary>
  11. /// 消息Id,64位整型
  12. /// </summary>
  13. public string MsgId { get; set; }
  14. }
  15. /// <summary>
  16. /// 图片消息类型(例外)
  17. /// </summary>
  18. public class MsgImage : BaseMsg
  19. {
  20. /// <summary>
  21. /// 图片链接
  22. /// </summary>
  23. public string PicUrl { get; set; }
  24. /// <summary>
  25. /// 消息Id,64位整型
  26. /// </summary>
  27. public string MsgId { get; set; }
  28. /// <summary>
  29. /// 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
  30. /// </summary>
  31. public string MediaId { get; set; }
  32. }
  33. /// <summary>
  34. /// 语音消息类型(例外)
  35. /// </summary>
  36. public class MsgVoice : BaseMsg
  37. {
  38. /// <summary>
  39. /// 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
  40. /// </summary>
  41. public string MediaId { get; set; }
  42. /// <summary>
  43. /// 语音格式,如amr,speex等
  44. /// </summary>
  45. public string Format { get; set; }
  46. /// <summary>
  47. /// 消息id,64位整型
  48. /// </summary>
  49. public string MsgID { get; set; }
  50. }
  51. /// <summary>
  52. /// 视频消息类型(例外)
  53. /// </summary>
  54. public class MsgVideo : BaseMsg
  55. {
  56. /// <summary>
  57. /// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据
  58. /// </summary>
  59. public string MediaId { get; set; }
  60. /// <summary>
  61. /// 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
  62. /// </summary>
  63. public string ThumbMediaId { get; set; }
  64. /// <summary>
  65. /// 消息id,64位整型
  66. /// </summary>
  67. public string MsgId { get; set; }
  68. }
  69. /// <summary>
  70. /// 小视频消息类型(例外)
  71. /// </summary>
  72. public class MsgShortVideo : BaseMsg
  73. {
  74. /// <summary>
  75. /// 视频消息媒体id,可以调用多媒体文件下载接口拉取数据
  76. /// </summary>
  77. public string MediaId { get; set; }
  78. /// <summary>
  79. /// 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
  80. /// </summary>
  81. public string ThumbMediaId { get; set; }
  82. /// <summary>
  83. /// 消息id,64位整型
  84. /// </summary>
  85. public string MsgId { get; set; }
  86. }
  87. /// <summary>
  88. /// 地理位置消息类型(例外)
  89. /// </summary>
  90. public class MsgLocation : BaseMsg
  91. {
  92. /// <summary>
  93. /// 地理位置维度
  94. /// </summary>
  95. public string Location_X { get; set; }
  96. /// <summary>
  97. /// 地理位置经度
  98. /// </summary>
  99. public string Location_Y { get; set; }
  100. /// <summary>
  101. /// 地图缩放大小
  102. /// </summary>
  103. public string Scale { get; set; }
  104. /// <summary>
  105. /// 地理位置信息
  106. /// </summary>
  107. public string Label { get; set; }
  108. /// <summary>
  109. /// 消息id,64位整型
  110. /// </summary>
  111. public string MsgId { get; set; }
  112. }
  113. /// <summary>
  114. /// 链接消息类型(例外)
  115. /// </summary>
  116. public class MsgLink : BaseMsg
  117. {
  118. /// <summary>
  119. /// 消息标题
  120. /// </summary>
  121. public string Title { get; set; }
  122. /// <summary>
  123. /// 消息描述
  124. /// </summary>
  125. public string Description { get; set; }
  126. /// <summary>
  127. /// 消息链接
  128. /// </summary>
  129. public string Url { get; set; }
  130. /// <summary>
  131. /// 消息id,64位整型
  132. /// </summary>
  133. public string MsgId { get; set; }
  134. }

加载消息,转换成对象
  1. public static BaseMsg LoadMsg()
  2. {
  3. 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>";
  4. var doc = XElement.Parse(data);
  5. MsgType msgtype = (MsgType)Enum.Parse(typeof(MsgType), doc.Element("MsgType").Value.ToUpper());
  6. //MsgType msgtype = (MsgType)Enum.Parse(typeof(MsgType), "TEXT");
  7. switch (msgtype)
  8. {
  9. case MsgType.IMAGE:
  10. return ConvertObj<MsgImage>(data);
  11. case MsgType.LINK:
  12. return ConvertObj<MsgLink>(data);
  13. case MsgType.LOCATION:
  14. return ConvertObj<MsgLocation>(data);
  15. case MsgType.VIDEO:
  16. return ConvertObj<MsgVideo>(data);
  17. case MsgType.SHORTVIDEO:
  18. return ConvertObj<MsgShortVideo>(data);
  19. case MsgType.TEXT:
  20. return ConvertObj<MsgText>(data);
  21. case MsgType.EVENT:
  22. return null;
  23. default:
  24. return ConvertObj<BaseMsg>(data);
  25. }
  26. }

利用反射
  1. public static T ConvertObj<T>(string xmlstr)
  2. {
  3. try
  4. {
  5. var xml = XElement.Parse(xmlstr);
  6. var type = typeof(T);
  7. var t = Activator.CreateInstance<T>(); //动态创建实例,相当于 new T()
  8. var tousername = type.GetProperty("ToUserName");//搜索具有指定名称的公共属性
  9. //PropertyInfo.SetValue(object obj, object value, object[] index)
  10. tousername.SetValue(t, Convert.ChangeType(xml.Element("ToUserName").Value, tousername.PropertyType), null);
  11. xml.Element("ToUserName").Remove();
  12. var fromusername = type.GetProperty("FromUserName");
  13. fromusername.SetValue(t,
  14. Convert.ChangeType(xml.Element("FromUserName").Value, fromusername.PropertyType), null);
  15. xml.Element("FromUserName").Remove();
  16. var createtime = type.GetProperty("CreateTime");
  17. createtime.SetValue(t, Convert.ChangeType(xml.Element("CreateTime").Value, createtime.PropertyType), null);
  18. xml.Element("CreateTime").Remove();
  19. var msgType = type.GetProperty("MsgType");
  20. var msgtype = xml.Element("MsgType").Value;
  21. //msgType.SetValue()  是枚举,参数要改变
  22. msgType.SetValue(t, (MsgType)Enum.Parse(typeof(MsgType), msgtype.ToUpper()), null);
  23. xml.Element("MsgType").Remove();
  24. foreach (var element in xml.Elements())
  25. {
  26. var pr = type.GetProperty(element.Name.ToString());
  27. pr.SetValue(t, Convert.ChangeType(element.Value, pr.PropertyType), null);
  28. }
  29. return t;
  30. }
  31. catch (Exception)
  32. {
  33. return default(T);
  34. throw;
  35. }
  36. }

 


最新文章

  1. navicat注册码
  2. durex-word
  3. 看《css知多少》的一些总结
  4. objective-c(反射)
  5. Linux的学习路线图
  6. &quot;Principles of Reactive Programming&quot; 之 &lt;Persistent Actor State&gt;学习笔记
  7. poj1988 简单并查集
  8. GBT28181中的RTP
  9. TCP连接状态详解及TIME_WAIT过多的解决方法
  10. 为什么.Net平台不支持程序集卸载(Assembly.Unload)?
  11. echarts3 迁徙图 迁入迁出
  12. Unity打开外部程序exe/Bat文件方案
  13. HTTP Request &amp; Response
  14. Python 之自动获取公网IP
  15. BZOJ4892:[TJOI2017]dna(hash)
  16. Hadoop生态圈-Azkaban实战之Command类型多job工作流flow
  17. F4+2 团队项目软件设计方案
  18. SQL Server 调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
  19. 集合List与DataTable互转
  20. C#实现在图片上动态写内容

热门文章

  1. XRecyclerView Scrapped or attached views may not be recycled
  2. 线段树 poj 2991
  3. bzoj4498: 魔法的碰撞
  4. get last dirname/filename in a file path argument
  5. bzoj2091【Poi2010】The Minima Game
  6. oracle--知识点汇总2---laobai
  7. Agent理解
  8. 要学Java,怎么高效地学习,怎么规划
  9. sde用户下使用sqlplus登录错误ORA-12547: TNS:lost contact
  10. CSS3实现加载中效果