如何动态创建Nullable<T>类型实例?
动态创建Nullable实例的解决方案
问题根源在于:Nullable<T>是值类型,其默认状态(HasValue=false)装箱到object类型时会被转换为null。你用object接收反射创建的实例后,调用HasValue自然会触发空引用异常;而直接new Nullable<Guid>()是赋值给强类型变量,不会发生装箱,因此能正常访问属性。
解决方法1:直接使用default(T)(推荐)
这是最简洁的方案,当T本身就是可空值类型(如Guid?)时,default(T)完全等价于new Nullable<Guid>(),无需反射:
var instance = default(T); var hasValue = instance.HasValue; // 返回false,正常运行
解决方法2:修正反射代码,转换回强类型
如果必须通过反射创建,只需将Activator.CreateInstance的结果转换为T类型,避免装箱为null的问题:
var type = typeof(T); var underlyingType = Nullable.GetUnderlyingType(type); var nullableType = typeof(Nullable<>).MakeGenericType(underlyingType); var instance = (T)Activator.CreateInstance(nullableType); // 转换为T强类型 var hasValue = instance.HasValue; // 正常返回false
原理补充
当T为Nullable<Guid>时,反射创建的是值类型实例,转换为T强类型后不会触发装箱操作,因此可以直接访问HasValue属性。若用object接收,值类型的默认可空实例会被装箱为null,引发后续调用异常。
内容的提问来源于stack exchange,提问作者Joseph Gabriel
相关产品推荐
相关产品推荐

