AntUtils.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. namespace Ant.Common
  7. {
  8. public static class AntUtils
  9. {
  10. static List<Type> MapTypes;
  11. public static readonly Dictionary<Type, DbType> _typeDbTypeMap;
  12. static AntUtils()
  13. {
  14. var mapTypes = new List<Type>();
  15. mapTypes.Add(typeof(string));
  16. mapTypes.Add(typeof(int));
  17. mapTypes.Add(typeof(long));
  18. mapTypes.Add(typeof(decimal));
  19. mapTypes.Add(typeof(double));
  20. mapTypes.Add(typeof(float));
  21. mapTypes.Add(typeof(bool));
  22. mapTypes.Add(typeof(DateTime));
  23. mapTypes.Add(typeof(short));
  24. mapTypes.Add(typeof(Guid));
  25. mapTypes.Add(typeof(byte));
  26. mapTypes.Add(typeof(char));
  27. mapTypes.Add(typeof(ulong));
  28. mapTypes.Add(typeof(uint));
  29. mapTypes.Add(typeof(ushort));
  30. mapTypes.Add(typeof(sbyte));
  31. mapTypes.Add(typeof(Object));
  32. mapTypes.Add(typeof(byte[]));
  33. mapTypes.TrimExcess();
  34. MapTypes = mapTypes;
  35. var typeDbTypeMap = new Dictionary<Type, DbType>();
  36. typeDbTypeMap[typeof(byte)] = DbType.Byte;
  37. typeDbTypeMap[typeof(sbyte)] = DbType.SByte;
  38. typeDbTypeMap[typeof(short)] = DbType.Int16;
  39. typeDbTypeMap[typeof(ushort)] = DbType.UInt16;
  40. typeDbTypeMap[typeof(int)] = DbType.Int32;
  41. typeDbTypeMap[typeof(uint)] = DbType.UInt32;
  42. typeDbTypeMap[typeof(long)] = DbType.Int64;
  43. typeDbTypeMap[typeof(ulong)] = DbType.UInt64;
  44. typeDbTypeMap[typeof(float)] = DbType.Single;
  45. typeDbTypeMap[typeof(double)] = DbType.Double;
  46. typeDbTypeMap[typeof(decimal)] = DbType.Decimal;
  47. typeDbTypeMap[typeof(bool)] = DbType.Boolean;
  48. typeDbTypeMap[typeof(string)] = DbType.String;
  49. typeDbTypeMap[typeof(char)] = DbType.StringFixedLength;
  50. typeDbTypeMap[typeof(Guid)] = DbType.Guid;
  51. typeDbTypeMap[typeof(DateTime)] = DbType.DateTime;
  52. typeDbTypeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
  53. typeDbTypeMap[typeof(TimeSpan)] = DbType.Time;
  54. typeDbTypeMap[typeof(byte[])] = DbType.Binary;
  55. typeDbTypeMap[typeof(Object)] = DbType.Object;
  56. //var typeDbTypeMap = new Dictionary<Type, DbType>();
  57. // typeDbTypeMap[typeof(byte)] = DbType.Byte;
  58. // typeDbTypeMap[typeof(sbyte)] = DbType.SByte;
  59. // typeDbTypeMap[typeof(short)] = DbType.Int16;
  60. // typeDbTypeMap[typeof(ushort)] = DbType.UInt16;
  61. // typeDbTypeMap[typeof(int)] = DbType.Int32;
  62. // typeDbTypeMap[typeof(uint)] = DbType.UInt32;
  63. // typeDbTypeMap[typeof(long)] = DbType.Int64;
  64. // typeDbTypeMap[typeof(ulong)] = DbType.UInt64;
  65. // typeDbTypeMap[typeof(float)] = DbType.Single;
  66. // typeDbTypeMap[typeof(double)] = DbType.Double;
  67. // typeDbTypeMap[typeof(decimal)] = DbType.Decimal;
  68. // typeDbTypeMap[typeof(bool)] = DbType.Boolean;
  69. // typeDbTypeMap[typeof(string)] = DbType.String;
  70. // typeDbTypeMap[typeof(char)] = DbType.StringFixedLength;
  71. // typeDbTypeMap[typeof(Guid)] = DbType.Guid;
  72. // typeDbTypeMap[typeof(DateTime)] = DbType.DateTime;
  73. // typeDbTypeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
  74. // typeDbTypeMap[typeof(TimeSpan)] = DbType.Time;
  75. // typeDbTypeMap[typeof(byte[])] = DbType.Binary;
  76. // typeDbTypeMap[typeof(byte?)] = DbType.Byte;
  77. // typeDbTypeMap[typeof(sbyte?)] = DbType.SByte;
  78. // typeDbTypeMap[typeof(short?)] = DbType.Int16;
  79. // typeDbTypeMap[typeof(ushort?)] = DbType.UInt16;
  80. // typeDbTypeMap[typeof(int?)] = DbType.Int32;
  81. // typeDbTypeMap[typeof(uint?)] = DbType.UInt32;
  82. // typeDbTypeMap[typeof(long?)] = DbType.Int64;
  83. // typeDbTypeMap[typeof(ulong?)] = DbType.UInt64;
  84. // typeDbTypeMap[typeof(float?)] = DbType.Single;
  85. // typeDbTypeMap[typeof(double?)] = DbType.Double;
  86. // typeDbTypeMap[typeof(decimal?)] = DbType.Decimal;
  87. // typeDbTypeMap[typeof(bool?)] = DbType.Boolean;
  88. // typeDbTypeMap[typeof(char?)] = DbType.StringFixedLength;
  89. // typeDbTypeMap[typeof(Guid?)] = DbType.Guid;
  90. // typeDbTypeMap[typeof(DateTime?)] = DbType.DateTime;
  91. // typeDbTypeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
  92. // typeDbTypeMap[typeof(TimeSpan?)] = DbType.Time;
  93. // typeDbTypeMap[typeof(Object)] = DbType.Object;
  94. _typeDbTypeMap = Clone(typeDbTypeMap);
  95. }
  96. /// <summary>
  97. /// 将C#参数类型转换成数据库类型
  98. /// </summary>
  99. /// <param name="type"></param>
  100. /// <returns></returns>
  101. public static DbType? TryGetDbType(Type type)
  102. {
  103. if (type == null)
  104. return null;
  105. Type unType;
  106. if (!IsNullable(type, out unType))
  107. unType = type;
  108. if (unType.IsEnum)
  109. unType = UtilConstants.TypeOfInt32;
  110. DbType ret;
  111. if (_typeDbTypeMap.TryGetValue(unType, out ret))
  112. return ret;
  113. return null;
  114. }
  115. public static void CheckNull(object obj, string paramName = null)
  116. {
  117. if (obj == null)
  118. throw new ArgumentNullException(paramName);
  119. }
  120. /// <summary>
  121. /// 判断类型是否为空没有返回值
  122. /// </summary>
  123. /// <param name="type"></param>
  124. /// <returns></returns>
  125. public static bool IsNullable(Type type)
  126. {
  127. Type unType;
  128. return IsNullable(type, out unType);
  129. }
  130. /// <summary>
  131. /// 判断类型是否为空
  132. /// </summary>
  133. /// <param name="type"></param>
  134. /// <param name="unType"></param>
  135. /// <returns></returns>
  136. public static bool IsNullable(Type type, out Type unType)
  137. {
  138. unType = Nullable.GetUnderlyingType(type);//返回指定可以为 null 的类型的基础类型参数
  139. return unType != null;
  140. }
  141. /// <summary>
  142. /// 判断两个值是否相等
  143. /// </summary>
  144. /// <param name="obj1"></param>
  145. /// <param name="obj2"></param>
  146. /// <returns></returns>
  147. public static bool AreEqual(object obj1, object obj2)
  148. {
  149. if (obj1 == null && obj2 == null)
  150. return true;
  151. if (obj1 != null)
  152. {
  153. return obj1.Equals(obj2);
  154. }
  155. if (obj2 != null)
  156. {
  157. return obj2.Equals(obj1);
  158. }
  159. return object.Equals(obj1, obj2);
  160. }
  161. /// <summary>
  162. /// 判断是Type类型
  163. /// </summary>
  164. /// <param name="type"></param>
  165. /// <returns></returns>
  166. public static bool IsMapType(Type type)
  167. {
  168. Type unType;
  169. if (!IsNullable(type, out unType))
  170. unType = type;
  171. if (unType.IsEnum)
  172. return true;
  173. return MapTypes.Contains(unType);
  174. }
  175. /// <summary>
  176. /// 是否是AnonymousType
  177. /// </summary>
  178. /// <param name="type"></param>
  179. /// <returns></returns>
  180. public static bool IsAnonymousType(Type type)
  181. {
  182. string typeName = type.Name;
  183. return typeName.Contains("<>") && typeName.Contains("__") && typeName.Contains("AnonymousType");
  184. }
  185. public static Dictionary<TKey, TValue> Clone<TKey, TValue>(Dictionary<TKey, TValue> source)
  186. {
  187. Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>(source.Count);
  188. foreach (var kv in source)
  189. {
  190. ret.Add(kv.Key, kv.Value);
  191. }
  192. return ret;
  193. }
  194. }
  195. }