国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#類型轉換

2019-11-17 02:49:30
字體:
來源:轉載
供稿:網友

C#類型轉換

一個比較通用的類型轉換不是個容易的事情,開發中獲取UI數據,或從數據庫取回數據(沒有使用ORM)的情況下,類型轉換都顯得特別繁瑣,曾經寫過非常丑陋的類型轉換代碼,下面這個略好一點,也能用在對象自動映射中。

類型轉換代碼

  1     public class TypeHelper  2     {  3         /// <summary>  4         /// 只應該用來轉換基本類型  5         /// </summary>  6         /// <param name="value"></param>  7         /// <param name="type"></param>  8         /// <param name="defaultVal"></param>  9         /// <returns></returns> 10         public static object ChangeType(object value, Type type, object defaultVal = null) 11         { 12             // 不傳入類型,直接返回 13             if (type == null) return value; 14  15             // 不傳入轉換值,返回類型的默認值 16             if (value == null) return GetDefaultValue(type); 17  18             // 類型一致不需要轉換 19             if (value.GetType() == type) return value; 20  21             // Nullable類型,把類型轉換為實際類型 22             if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 23             { 24                 type = type.GetGenericArguments()[0]; 25             } 26  27             // 枚舉類型處理 28             if (type.IsEnum) return ConvertToEnum(value, type); 29  30             // GUID類型處理 31             if (value is string && type == typeof(Guid)) 32             { 33                 Guid guid; 34                 Guid.TryParse(value as string, out guid); 35                 return guid; 36             } 37  38             // bool類型增加與int類型的轉換處理 39             if (type == typeof(bool)) 40             { 41                 int i; 42                 if (TryConvertToInt(value, out i)) 43                 { 44                     value = i != 0; 45                 } 46             } 47  48             // 其他的轉換 49             try 50             { 51                 return System.Convert.ChangeType(value, type); 52             } 53             catch 54             { 55                 return defaultVal ?? GetDefaultValue(type); 56             } 57         } 58  59         public static T ConvertTo<T>(object obj, T defalutValue = default(T)) 60         { 61             return (T)TypeHelper.ChangeType(obj, typeof(T), defalutValue); 62         } 63  64         PRivate static bool TryConvertToInt(object value, out int result) 65         { 66             try 67             { 68                 result = (int)System.Convert.ChangeType(value, typeof(int)); 69                 return true; 70             } 71             catch 72             { 73                 result = default(int); 74                 return false; 75             } 76         } 77  78         private static object ConvertToEnum(object value, Type type) 79         { 80             if (value is string) 81             { 82                 try 83                 { 84                     return Enum.Parse(type, value as string); 85                 } 86                 catch 87                 { 88                     return Activator.CreateInstance(type); 89                 } 90             } 91             else 92             { 93                 return Enum.ToObject(type, value); 94             } 95         } 96  97         private static object GetDefaultValue(Type type) 98         { 99             if (!type.IsValueType) return null;100 101             if (!_defaultValues.ContainsKey(type))102                 _defaultValues[type] = Activator.CreateInstance(type);103 104             return _defaultValues[type];105         }106 107         private static readonly Dictionary<Type, object> _defaultValues = new Dictionary<Type, object>();108     }

測試代碼

 1     [TestClass()] 2     public class TypeHelperTest 3     { 4         [TestMethod] 5         public void NormalTest() 6         { 7             Assert.AreEqual('1', TypeHelper.ChangeType("1", typeof(char))); 8             Assert.AreEqual(10, TypeHelper.ChangeType("10", typeof(int))); 9             Assert.AreEqual(10m, TypeHelper.ChangeType("10", typeof(decimal)));10         }11 12         [TestMethod]13         public void NullArgumentTest()14         {15             Assert.AreEqual(null, TypeHelper.ChangeType(null, null));16             Assert.AreEqual(0, TypeHelper.ChangeType(null, typeof(int)));17             Assert.AreEqual(0m, TypeHelper.ChangeType(null, typeof(decimal)));18             Assert.AreEqual(null, TypeHelper.ChangeType(null, typeof(string)));19             Assert.AreEqual("10", TypeHelper.ChangeType("10", null));20             Assert.AreEqual(10, TypeHelper.ChangeType(10, null));21         }22 23         [TestMethod]24         public void NullableTypeTest()25         {26             Assert.AreEqual(null, TypeHelper.ChangeType(null, typeof(int?)));27             Assert.AreEqual(10, TypeHelper.ChangeType("10", typeof(int?)));28         }29 30         [TestMethod]31         public void BoolTypeTest()32         {33             Assert.AreEqual(true, TypeHelper.ChangeType("true", typeof(bool)));34             Assert.AreEqual(false, TypeHelper.ChangeType("false", typeof(bool)));35 36             Assert.AreEqual(true, TypeHelper.ChangeType("TRUE", typeof(bool)));37             Assert.AreEqual(false, TypeHelper.ChangeType("FALSE", typeof(bool)));38 39             Assert.AreEqual(true, TypeHelper.ChangeType("1", typeof(bool)));40             Assert.AreEqual(false, TypeHelper.ChangeType("0", typeof(bool)));41 42             Assert.AreEqual(true, TypeHelper.ChangeType(1, typeof(bool)));43             Assert.AreEqual(false, TypeHelper.ChangeType(0, typeof(bool)));44 45             Assert.AreEqual(true, TypeHelper.ChangeType("11", typeof(bool)));46             Assert.AreEqual(true, TypeHelper.ChangeType("-1", typeof(bool)));47         }48 49         [TestMethod]50         public void EnumTypeTest()51         {52             Assert.AreEqual(TestEnum.A, TypeHelper.ChangeType(1, typeof(TestEnum)));53             Assert.AreEqual(TestEnum.A, TypeHelper.ChangeType("1", typeof(TestEnum)));54             Assert.AreEqual(TestEnum.A, TypeHelper.ChangeType("A", typeof(TestEnum)));55             Assert.AreEqual((TestEnum)0, TypeHelper.ChangeType("a", typeof(TestEnum)));56         }57 58         [TestMethod]59         public void GuidTypeTest()60         {61             Assert.AreEqual(Guid.Empty, TypeHelper.ChangeType(null, typeof(Guid)));62             Assert.AreEqual(Guid.Empty, TypeHelper.ChangeType("dfdsfs", typeof(Guid)));63             Assert.AreEqual(new Guid("{244F8EE2-DDD3-486A-B3E7-9EFDEEE4488C}"), TypeHelper.ChangeType("{244F8EE2-DDD3-486A-B3E7-9EFDEEE4488C}", typeof(Guid)));64         }65     }66 67     public enum TestEnum68     {69         A = 1, B = 270     }71 }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泾阳县| 女性| 建湖县| 册亨县| 双峰县| 琼海市| 常德市| 太湖县| 玉门市| 五华县| 云林县| 神木县| 石河子市| 镇雄县| 漠河县| 罗平县| 陆良县| 惠州市| 淮北市| 绥棱县| 南开区| 礼泉县| 九台市| 桑日县| 莲花县| 女性| 麻城市| 禄劝| 汤阴县| 清水县| 徐州市| 延长县| 九龙城区| 林州市| 芜湖县| 武乡县| 房产| 阳东县| 米林县| 方山县| 凤翔县|