我试图在环境中创建一个扩展方法,其中使用了大量的反射。
方法的目的是重新创建default()在运行时的作用。
它适用于除Nullable<>之外的所有内容。类型。甚至?-Types正常工作。
如果分配给对象变量的值是Nullable<>,我不知道如何找到答案。而不是“常规的价值类型”
Nullable.GetUnderlyingType-Method在这种情况下返回null,但适用于?-Types。
我们知道默认(Nullable)== null。 当Nullable分配0时,我的扩展方法会产生错误的结果,因为0 == default(int)。
我希望你能得到我想在这里解释的内容,简而言之: - 如何确定“随机”对象是否为Nullable而不是int?
方法看起来像这样(为简单起见,删除了任何缓存) 我从这里获取了部分How to check if an object is nullable?
public static bool IsDefault(this object obj)
{
if(obj == null)
return true;
else
{
Type objType = obj.GetType(); // This gives int32 for Nullabe<int> !?!
if(Nullable.GetUnderlyingType(objType) != null)
return false;
else if(objType.IsValueType)
return Object.Equals(obj, Activator.CreateInstance(objType);
else
return false;
}
}
为了更清楚,我不能使用通用的东西......
答案 0 :(得分:3)
你不能这样做,因为当你调用方法时,可以为空的结构被装箱为object
,并成为null
或Int32
值。这在前面的答案中有解释:Why GetType returns System.Int32 instead of Nullable<Int32>?
如果您的变量在调用此方法的位置键入为对象,我认为您无法获得所需的信息 - 它已经装箱。
答案 1 :(得分:2)
当一个可空类型被装箱到object
时,它可以为空的这一事实将丢失:它要么变成普通的int
,要么变成普通的null
。如果您的对象已存储为object
类型,则无法恢复此状态。
答案 2 :(得分:0)
似乎你可以通过这样的事情找出一个类型是否可以为空:
public static bool IsDefault<T>( this T obj )
{
var t = typeof( T );
var isNullable = t.IsGenericType && t.GetGenericTypeDefinition() == typeof( Nullable<> );
// ...
}
尽管如此,您的方法必须是通用的。
答案 3 :(得分:-1)
来自http://msdn.microsoft.com/en-us/library/ms366789.aspx:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}