本篇文章讨论可空值类型(Nullable
十多年的东西湖网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整东西湖建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“东西湖网站设计”,“东西湖网站推广”以来,每个客户项目都认真落实执行。
一、四种典型的类型转换方式
对于类型转化,或者进一步地,对于像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
Convert几乎实现所有“兼容类型”之间的转换,也可以向Parse方法一样解析具有合法格式的字符串。但是,如果目标类型换成是Nullable
- 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
- 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
- int intValue1 = 123;
- int? intValue2 = intValue1;
- int? intValue3 = (int?)intValue1;
三、将基于Nullable
从上面的介绍我们可以得出这样的结论:如果类型T1和T2能够相互兼容,我们可以借助Convert将T1类型对象转换成T2类型,然后通过显式类型转换进一步转换成Nullable
- public static class ConvertionExtensions
- {
- public static T? ConvertTo
(this IConvertible convertibleValue) where T : struct - {
- if (null == convertibleValue)
- {
- return null;
- }
- return (T?)Convert.ChangeType(convertibleValue, typeof(T));
- }
- }
借助于上面这个扩展方法ConvertTo,对于目标类型为Nullable
- int? intValue = "123".ConvertTo
(); - double? doubleValue = "123".ConvertTo
(); - DateTime? dateTimeValue = "1981-08-24".ConvertTo
();
四、进一步完善扩展方法ConvertTo
上面定义的扩展方法只能完成针对目标类型为Nullable
- public static T ConvertTo
(this IConvertible convertibleValue) - {
- if (null == convertibleValue)
- {
- return default(T);
- }
- if (!typeof(T).IsGenericType)
- {
- return (T)Convert.ChangeType(convertibleValue, typeof(T));
- }
- else
- {
- Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
- if (genericTypeDefinition == typeof(Nullable<>))
- {
- return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
- }
- }
- throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));
- }
在上面的方法中,我们首先需要确定目标类型是否是Nullable
- int intValue1 = "123".ConvertTo
(); - int? intValue2 = "123".ConvertTo
(); - DateTime dateTimeValue1 = "1981-08-24".ConvertTo
(); - DateTime? dateTimeValue2 = "1981-08-24".ConvertTo
();
五、谈谈NullableConverter
上面谈到TypeConverter这个类型,并且说到它具有一系列针对具体数据类型的子类。其中一个子类就是NullableConverter,故名思义,这个TypeConverter专门用于Nullable
- string literalValue = "1981-08-24";
- NullableConverter converter = new NullableConverter(typeof(DateTime?));
- DateTime? dateTimevalue = (DateTime?)converter.ConvertFromString(literalValue);
本文标题:谈谈Nullable的类型转换问题
链接分享:http://www.gawzjz.com/qtweb/news29/189929.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联