本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。
一、四种典型的类型转换方式
对于类型转化,或者进一步地,对于像Int、Double、DateTime、String等这些原生类型之间的转化,我们具有四种典型的转换方式。如果类型之间不具有隐士转换关系存储,我们可以之间通过类型转换操作符进行显式转换,比如:
- double doubleValue = 3.14159265;
- int intValue = (int)doubleValue;
第二种则是借助于Convert这个静态类型的ChangeType或者ToXxx方法(Xxx代表转换的目标类型),比如:
- string literalValue = "123";
- int intValue1 = Convert.ToInt32(literalValue);
- int intValue2 = (int)Convert.ChangeType(literalValue,typeof(int));
第三种方法为创建TypeConverter或者它的基于具体类型的若干子类,比如StringConverter、BooleanConverter、DateTimeConverter等。在使用的时候你需要先实例化相应的TypeConverter,然后调用相应的类型转换方法。比如:
- string literalValue = "1981-08-24";
- DateTimeConverter dateTypeConverter = newDateTimeConverter();
- DateTime dateTimeValue = (DateTime)dateTypeConverter.ConvertFromString(literalValue);
- literalValue = "02:40:50";
- TimeSpanConverter timeSpanConverter = new imeSpanConverter();
- TimeSpan timeSpanValue = (TimeSpan imeSpanConverter.ConvertFromString(literalValue);
最后一种常见的方法用在将基于某种具体类型的格式化字符串转化成对应的类型,我们可以调用具体类型的静态方法Parse或者TryParse实现类型的转换,比如:
- string literalValue = "1981-08-24";
- DateTime dateTimeValue1 = DateTime.Parse(literalValue); DateTime dateTimeValue2;
- if (DateTime.TryParse(literalValue, out dateTimeValue2))
- {
-
- }
二、当类型转换遭遇Nullable<T>类型
Convert几乎实现所有“兼容类型”之间的转换,也可以向Parse方法一样解析具有合法格式的字符串。但是,如果目标类型换成是Nullable<T>类型的时候,类型转换将会失败。比如我们将上面第二个例子的目标类型从int换成int?(Nullable<Int32>):
- string literalValue = "123";
- try
- {
- int? intValue = (int?)Convert.ChangeType(literalValue,typeof(int?));
- }
- catch (InvalidCastException ex)
- {
- Console.WriteLine(ex.Message);
- }
类型转换错误消息会被输出:
- Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib,
- Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'
实际上,如果你调用Convert的ChangeType方法将任何类型对象转换成Nullable<T>类型,都会抛出出InvalidCastException异常,即使你将T类型转化成Nullable<T>。比如,我们将上面的例子中原数据类型换成int类型:
- int intValue1 = 123;
- try
- {
- int? intValue = (int?)Convert.ChangeType(intValue1,typeof(int?));
- }
- catch (InvalidCastException ex)
- {
- Console.WriteLine(ex.Message);
- }
依然会输入类似的错误信息:
- Invalid cast from 'System.Int32' to 'System.Nullable`1[[System.Int32, mscorlib,
- Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
而实际上,T类型的对象是可以显式或者隐式转化成Nullable<T>对象的。也就是说,下面代码所表示的类型转换是没有问题的:
- int intValue1 = 123;
- int? intValue2 = intValue1;
- int? intValue3 = (int?)intValue1;
三、将基于Nullable<T>的类型转换实现在扩展方法中
从上面的介绍我们可以得出这样的结论:如果类型T1和T2能够相互兼容,我们可以借助Convert将T1类型对象转换成T2类型,然后通过显式类型转换进一步转换成Nullable<T2>。我们可以通过这两个步骤实现针对于Nullable<T>类型的转换。为了操作方便,我将此转换逻辑写在针对IConvertible接口的扩展方法中:
- public static class ConvertionExtensions
- {
- public static T?
来源:
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】
打赏
扫码打赏,您说多少就多少