【发布时间】:2008-12-17 14:17:16
【问题描述】:
如何检查给定对象是否可以为空,换句话说如何实现以下方法...
bool IsNullableValueType(object o)
{
...
}
我正在寻找可为空的值类型。我没有想到引用类型。
//Note: This is just a sample. The code has been simplified
//to fit in a post.
public class BoolContainer
{
bool? myBool = true;
}
var bc = new BoolContainer();
const BindingFlags bindingFlags = BindingFlags.Public
| BindingFlags.NonPublic
| BindingFlags.Instance
;
object obj;
object o = (object)bc;
foreach (var fieldInfo in o.GetType().GetFields(bindingFlags))
{
obj = (object)fieldInfo.GetValue(o);
}
obj 现在指的是 bool (System.Boolean) 类型的对象,其值等于 true。我真正想要的是Nullable<bool>
所以现在作为一种解决方法,我决定检查 o 是否可以为空,并在 obj 周围创建一个可以为空的包装器。
【问题讨论】:
-
代码是否应该包含可以为空的字符串?它们是似乎可以为空的非泛型 ValueType。还是它们不是 ValueType?
-
String 不是 ValueType。它是一个引用类型。
-
这是一个非常好的问题! 'Type.IsNullableType()' 有点欺骗,因为它实际上只检查类型是 'Nullable
',如果你真的想检查任何可以接受 null 的类型,它不会返回预期的结果值(例如,我尝试与 a.IsNullableType() 一起使用,其中 'a' 是在运行时确定的 'typeof(string)') -
答案在 fieldInfo.FieldType 中:检查 FieldType 是否为泛型,泛型是否为 Nullable 类型。 (例如:if (FieldType.IsGenericType && FieldType.GetGenericTypeDefinition() == typeof(Nullable)))。不要尝试获取 obj.GetType() 它将具有 Nullable
变量 T 的 UndelyingSystemType(在您的布尔类型的情况下,而不是 Nullable ),这是一个装箱问题。