Type t = typeof(int?); //will get this dynamically
object val = 5; //will get this dynamically
object nVal = Convert.ChangeType(val, t);//getting exception here

我在上面的代码中得到了InvalidCastException.对于上面的代码,我可以简单地编写int? nVal = val个,但上面的代码是动态执行的.

我正在获取一个包装在对象(这里是val)中的值(不可为空的类型,如int、Float等),我必须通过将其强制转换为另一个类型(该类型可以是也不能是它的可为空版本)来将其保存到另一个对象.什么时候

"系统"的强制转换无效.Int32"到"系统.可为null的`1[[System.Int32,

一个int,应该是可转换/类型可铸造到nullable int的,这里有什么问题吗?

推荐答案

你必须使用Nullable.GetUnderlyingType来获得Nullable的基本类型.

这是我用来克服Nullable不能超过ChangeType的限制的方法

public static T ChangeType<T>(object value) 
{
   var t = typeof(T);

   if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
   {
       if (value == null) 
       { 
           return default(T); 
       }

       t = Nullable.GetUnderlyingType(t);
   }

   return (T)Convert.ChangeType(value, t);
}

非泛型方法:

public static object ChangeType(object value, Type conversion) 
{
   var t = conversion;

   if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
   {
       if (value == null) 
       { 
           return null; 
       }

       t = Nullable.GetUnderlyingType(t);
   }

   return Convert.ChangeType(value, t);
}

.net相关问答推荐

为什么DotNet新的webapi;命令会为我生成不同的文件夹

CLR如何在后台优化布尔比较操作?

Ubuntu 22.04 + JetBrains Rider 不能做脚手架 dbContext

在 C# 中生成随机小数

为什么这个多态 C# 代码会打印它的功能?

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

MongoDB C# 驱动程序 - 忽略绑定字段

AutoMapper 的替代品

每第 N 个字符/数字拆分一个字符串/数字?

如何防止和/或处理 StackOverflowException?

.Net 中的 Int128?

在 Moq Callback() 调用中设置变量值

读取方法的属性值

什么是 project.lock.json?

如何使用 NUnit(或可能使用另一个框架)测试异步方法?

我应该在 LINQ 查询中使用两个where子句还是&&?

如何从 .NET 中的流中获取 MemoryStream?

如何将 System.Type 转换为其可为空的版本?

表单不响应 KeyDown 事件

System.ServiceModel 在 .NET Core 项目中找不到