以下是我用来检测我们是否正在处理Nullable类型的条件:
System.Nullable.GetUnderlyingType(itemType) != null
这里是队友的代码:
itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>)
我们实际上并没有找到一个案例,其中一个将返回true
而另一个false
(反之亦然),但这两个片段是否完全相同?
答案 0 :(得分:4)
来自MSDN for Nullable.GetUnderlyingType Method:
nullableType参数的type参数,如果nullableType参数是封闭的通用可空类型;否则,null。
所以,是的,使用以前的版本是安全的。
从GetUnderlyingType反编译:
public static Type GetUnderlyingType(Type nullableType)
{
if (nullableType == null)
throw new ArgumentNullException("nullableType");
Type type = (Type) null;
if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && nullableType.GetGenericTypeDefinition() == typeof (Nullable<>))
type = nullableType.GetGenericArguments()[0];
return type;
}
答案 1 :(得分:1)
这两个片段并不完全相同 以下是为每个片段返回不同值的测试用例:
Type t = typeof(Nullable<>);
bool c1 = Nullable.GetUnderlyingType(t) != null; //false
bool c2 = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>); //true
因此Nullable.GetUnderlyingType方法更安全,因为它的实现已包含此测试用例检查:
public static Type GetUnderlyingType(Type nullableType) {
if (nullableType == null)
throw new ArgumentNullException("nullableType");
Type type = null;
if ((nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition)
&& (nullableType.GetGenericTypeDefinition() == typeof(Nullable<>))) {
type = nullableType.GetGenericArguments()[0];
}
return type;
}
答案 2 :(得分:1)
您的队友的代码非常好,如MSDN
文档(摘录)中所示:
使用以下代码确定Type对象是否表示Nullable类型。请记住,如果从调用GetType返回Type对象,则此代码始终返回false。
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}
在下面的MSDN链接中解释:
http://msdn.microsoft.com/en-us/library/ms366789.aspx
此外,在此SO QA上也有类似的讨论:
答案 3 :(得分:0)
每当测试一个类型是否可以为空时,我总是使用你发布的第二种方法:
itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>)
我没有遇到过这个问题!
问候,
答案 4 :(得分:0)
dotPeek显示了这一点:
public static Type GetUnderlyingType(Type nullableType)
{
if (nullableType == null)
throw new ArgumentNullException("nullableType");
Type type = (Type) null;
if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && object.ReferenceEquals((object) nullableType.GetGenericTypeDefinition(), (object) typeof (Nullable<>)))
type = nullableType.GetGenericArguments()[0];
return type;
}
我看到的唯一区别是itemType
本身是通用的,即。 typeof (List<>)
,他的意志会失败。而你的速度稍慢,因为它必须实际找到基础类型。