Reflection.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using System.Reflection;
  8. /// <summary>
  9. /// 反射相关工具集
  10. /// </summary>
  11. public partial class Utils
  12. {
  13. /// <summary>
  14. /// C#对象根据属性名获取值
  15. /// </summary>
  16. /// <param name="csObj"></param>
  17. /// <param name="property"></param>
  18. /// <returns></returns>
  19. public static object GetPropertyValue(object csObj, string property)
  20. {
  21. PropertyInfo pinfo = csObj.GetType().GetProperty(property);
  22. if (pinfo == null) return null;
  23. return pinfo.GetValue(csObj, null);
  24. }
  25. /// <summary>
  26. /// C#对象根据属性名赋值
  27. /// </summary>
  28. /// <param name="csObj"></param>
  29. /// <param name="property"></param>
  30. /// <param name="value"></param>
  31. public static void SetPropertyValue(object csObj, string property, object value)
  32. {
  33. if (value == null) return;
  34. PropertyInfo pinfo = csObj.GetType().GetProperty(property);
  35. if (pinfo != null)
  36. {
  37. if (pinfo.PropertyType == typeof(string))
  38. {
  39. pinfo.SetValue(csObj, value.ToString(), null);
  40. }
  41. else if (pinfo.PropertyType == typeof(float))
  42. {
  43. pinfo.SetValue(csObj, float.Parse(value.ToString()), null);
  44. }
  45. else if (pinfo.PropertyType == typeof(double))
  46. {
  47. pinfo.SetValue(csObj, double.Parse(value.ToString()), null);
  48. }
  49. else if (pinfo.PropertyType == typeof(int))
  50. {
  51. pinfo.SetValue(csObj, int.Parse(value.ToString()), null);
  52. }
  53. else if (pinfo.PropertyType == typeof(long))
  54. {
  55. pinfo.SetValue(csObj, long.Parse(value.ToString()), null);
  56. }
  57. else
  58. {
  59. csObj.GetType().GetProperty(property).SetValue(csObj, value, null);
  60. }
  61. }
  62. }
  63. /// <summary>
  64. /// C#获取对象全部属性名
  65. /// </summary>
  66. /// <param name="csObj"></param>
  67. /// <returns></returns>
  68. public static List<string> GetProperties(object csObj)
  69. {
  70. List<string> properties = new List<string>();
  71. foreach (PropertyInfo pinfo in csObj.GetType().GetProperties())
  72. {
  73. properties.Add(pinfo.Name);
  74. }
  75. return properties;
  76. }
  77. /// <summary>
  78. /// C#通过反射机制初始化特定类型对象
  79. /// </summary>
  80. /// <typeparam name="T"></typeparam>
  81. /// <param name="jObj"></param>
  82. /// <returns></returns>
  83. public static T LoadClass<T>(JObject jObj) where T : new()
  84. {
  85. return LoadObject(jObj, new T());
  86. }
  87. /// <summary>
  88. /// C#通过反射机制初始化特定类型对象
  89. /// </summary>
  90. /// <typeparam name="T"></typeparam>
  91. /// <param name="token"></param>
  92. /// <returns></returns>
  93. public static T LoadClass<T>(JToken token) where T : new()
  94. {
  95. return LoadObject(token, new T());
  96. }
  97. /// <summary>
  98. /// C#通过属性表反射原理从JObject加载实例对象
  99. /// </summary>
  100. /// <typeparam name="T"></typeparam>
  101. /// <param name="jObj"></param>
  102. /// <param name="csObj"></param>
  103. /// <returns></returns>
  104. public static T LoadObject<T>(JObject jObj, T csObj)
  105. {
  106. foreach (KeyValuePair<string, JToken> pair in jObj)
  107. {
  108. SetPropertyValue(csObj, pair.Key, pair.Value.ToString());
  109. }
  110. return csObj;
  111. }
  112. /// <summary>
  113. /// C#通过属性表反射原理从JToken加载实例对象
  114. /// </summary>
  115. /// <typeparam name="T"></typeparam>
  116. /// <param name="token"></param>
  117. /// <param name="csObj"></param>
  118. /// <returns></returns>
  119. public static T LoadObject<T>(JToken token, T csObj)
  120. {
  121. JObject jObj = JObject.Parse(token.ToString());
  122. return LoadObject(jObj, csObj);
  123. }
  124. /// <summary>
  125. /// C#通过属性表反射原理从JArry加载数组
  126. /// </summary>
  127. /// <typeparam name="T"></typeparam>
  128. /// <param name="array"></param>
  129. /// <returns></returns>
  130. public static List<T> LoadArray<T>(JArray array) where T : new()
  131. {
  132. List<T> ret = new List<T>();
  133. foreach (JToken token in array)
  134. {
  135. ret.Add(LoadClass<T>(token));
  136. }
  137. return ret;
  138. }
  139. /// <summary>
  140. /// C#通过属性表反射原理从JArry加载数组
  141. /// </summary>
  142. /// <typeparam name="T"></typeparam>
  143. /// <param name="token"></param>
  144. /// <returns></returns>
  145. public static List<T> LoadArray<T>(JToken token) where T : new()
  146. {
  147. return LoadArray<T>(JArray.Parse(token.ToString()));
  148. }
  149. /*
  150. /// <summary>
  151. /// C#原生对象克隆
  152. /// </summary>
  153. /// <typeparam name="T"></typeparam>
  154. /// <param name="obj"></param>
  155. /// <returns></returns>
  156. public static T CloneObject<T>(T obj) where T : new()
  157. {
  158. T desObj = new T();
  159. foreach (PropertyInfo pinfo in desObj.GetType().GetProperties())
  160. {
  161. SetPropertyValue(desObj, pinfo.Name, GetPropertyValue(obj, pinfo.Name));
  162. }
  163. return desObj;
  164. }
  165. * */
  166. /// <summary>
  167. /// C#原生对象属性表映射加载
  168. /// </summary>
  169. /// <param name="surObj">源对象</param>
  170. /// <param name="desObj">目标对象</param>
  171. public static void LoadObject(object surObj, object desObj)
  172. {
  173. foreach (PropertyInfo pinfo in desObj.GetType().GetProperties())
  174. {
  175. SetPropertyValue(desObj, pinfo.Name, GetPropertyValue(surObj, pinfo.Name));
  176. }
  177. }
  178. /// <summary>
  179. /// List随机其中一个元素
  180. /// </summary>
  181. /// <typeparam name="T"></typeparam>
  182. /// <param name="array"></param>
  183. /// <returns></returns>
  184. public static T ArrayRandom<T>(List<T> array)
  185. {
  186. int count = array.Count;
  187. int ran = UnityEngine.Random.Range(0, count);
  188. return array[ran];
  189. }
  190. }