using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace Ant.Common { public static class AntUtils { static List MapTypes; public static readonly Dictionary _typeDbTypeMap; static AntUtils() { var mapTypes = new List(); mapTypes.Add(typeof(string)); mapTypes.Add(typeof(int)); mapTypes.Add(typeof(long)); mapTypes.Add(typeof(decimal)); mapTypes.Add(typeof(double)); mapTypes.Add(typeof(float)); mapTypes.Add(typeof(bool)); mapTypes.Add(typeof(DateTime)); mapTypes.Add(typeof(short)); mapTypes.Add(typeof(Guid)); mapTypes.Add(typeof(byte)); mapTypes.Add(typeof(char)); mapTypes.Add(typeof(ulong)); mapTypes.Add(typeof(uint)); mapTypes.Add(typeof(ushort)); mapTypes.Add(typeof(sbyte)); mapTypes.Add(typeof(Object)); mapTypes.Add(typeof(byte[])); mapTypes.TrimExcess(); MapTypes = mapTypes; var typeDbTypeMap = new Dictionary(); typeDbTypeMap[typeof(byte)] = DbType.Byte; typeDbTypeMap[typeof(sbyte)] = DbType.SByte; typeDbTypeMap[typeof(short)] = DbType.Int16; typeDbTypeMap[typeof(ushort)] = DbType.UInt16; typeDbTypeMap[typeof(int)] = DbType.Int32; typeDbTypeMap[typeof(uint)] = DbType.UInt32; typeDbTypeMap[typeof(long)] = DbType.Int64; typeDbTypeMap[typeof(ulong)] = DbType.UInt64; typeDbTypeMap[typeof(float)] = DbType.Single; typeDbTypeMap[typeof(double)] = DbType.Double; typeDbTypeMap[typeof(decimal)] = DbType.Decimal; typeDbTypeMap[typeof(bool)] = DbType.Boolean; typeDbTypeMap[typeof(string)] = DbType.String; typeDbTypeMap[typeof(char)] = DbType.StringFixedLength; typeDbTypeMap[typeof(Guid)] = DbType.Guid; typeDbTypeMap[typeof(DateTime)] = DbType.DateTime; typeDbTypeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset; typeDbTypeMap[typeof(TimeSpan)] = DbType.Time; typeDbTypeMap[typeof(byte[])] = DbType.Binary; typeDbTypeMap[typeof(Object)] = DbType.Object; //var typeDbTypeMap = new Dictionary(); // typeDbTypeMap[typeof(byte)] = DbType.Byte; // typeDbTypeMap[typeof(sbyte)] = DbType.SByte; // typeDbTypeMap[typeof(short)] = DbType.Int16; // typeDbTypeMap[typeof(ushort)] = DbType.UInt16; // typeDbTypeMap[typeof(int)] = DbType.Int32; // typeDbTypeMap[typeof(uint)] = DbType.UInt32; // typeDbTypeMap[typeof(long)] = DbType.Int64; // typeDbTypeMap[typeof(ulong)] = DbType.UInt64; // typeDbTypeMap[typeof(float)] = DbType.Single; // typeDbTypeMap[typeof(double)] = DbType.Double; // typeDbTypeMap[typeof(decimal)] = DbType.Decimal; // typeDbTypeMap[typeof(bool)] = DbType.Boolean; // typeDbTypeMap[typeof(string)] = DbType.String; // typeDbTypeMap[typeof(char)] = DbType.StringFixedLength; // typeDbTypeMap[typeof(Guid)] = DbType.Guid; // typeDbTypeMap[typeof(DateTime)] = DbType.DateTime; // typeDbTypeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset; // typeDbTypeMap[typeof(TimeSpan)] = DbType.Time; // typeDbTypeMap[typeof(byte[])] = DbType.Binary; // typeDbTypeMap[typeof(byte?)] = DbType.Byte; // typeDbTypeMap[typeof(sbyte?)] = DbType.SByte; // typeDbTypeMap[typeof(short?)] = DbType.Int16; // typeDbTypeMap[typeof(ushort?)] = DbType.UInt16; // typeDbTypeMap[typeof(int?)] = DbType.Int32; // typeDbTypeMap[typeof(uint?)] = DbType.UInt32; // typeDbTypeMap[typeof(long?)] = DbType.Int64; // typeDbTypeMap[typeof(ulong?)] = DbType.UInt64; // typeDbTypeMap[typeof(float?)] = DbType.Single; // typeDbTypeMap[typeof(double?)] = DbType.Double; // typeDbTypeMap[typeof(decimal?)] = DbType.Decimal; // typeDbTypeMap[typeof(bool?)] = DbType.Boolean; // typeDbTypeMap[typeof(char?)] = DbType.StringFixedLength; // typeDbTypeMap[typeof(Guid?)] = DbType.Guid; // typeDbTypeMap[typeof(DateTime?)] = DbType.DateTime; // typeDbTypeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset; // typeDbTypeMap[typeof(TimeSpan?)] = DbType.Time; // typeDbTypeMap[typeof(Object)] = DbType.Object; _typeDbTypeMap = Clone(typeDbTypeMap); } /// /// 将C#参数类型转换成数据库类型 /// /// /// public static DbType? TryGetDbType(Type type) { if (type == null) return null; Type unType; if (!IsNullable(type, out unType)) unType = type; if (unType.IsEnum) unType = UtilConstants.TypeOfInt32; DbType ret; if (_typeDbTypeMap.TryGetValue(unType, out ret)) return ret; return null; } public static void CheckNull(object obj, string paramName = null) { if (obj == null) throw new ArgumentNullException(paramName); } /// /// 判断类型是否为空没有返回值 /// /// /// public static bool IsNullable(Type type) { Type unType; return IsNullable(type, out unType); } /// /// 判断类型是否为空 /// /// /// /// public static bool IsNullable(Type type, out Type unType) { unType = Nullable.GetUnderlyingType(type);//返回指定可以为 null 的类型的基础类型参数 return unType != null; } /// /// 判断两个值是否相等 /// /// /// /// public static bool AreEqual(object obj1, object obj2) { if (obj1 == null && obj2 == null) return true; if (obj1 != null) { return obj1.Equals(obj2); } if (obj2 != null) { return obj2.Equals(obj1); } return object.Equals(obj1, obj2); } /// /// 判断是Type类型 /// /// /// public static bool IsMapType(Type type) { Type unType; if (!IsNullable(type, out unType)) unType = type; if (unType.IsEnum) return true; return MapTypes.Contains(unType); } /// /// 是否是AnonymousType /// /// /// public static bool IsAnonymousType(Type type) { string typeName = type.Name; return typeName.Contains("<>") && typeName.Contains("__") && typeName.Contains("AnonymousType"); } public static Dictionary Clone(Dictionary source) { Dictionary ret = new Dictionary(source.Count); foreach (var kv in source) { ret.Add(kv.Key, kv.Value); } return ret; } } }