如果我有一个可空类型的MemberInfo
,我怎么能确定它是否已被分配一个值?
MemberInfo
没有获取值的方法,因为MemberInfo
可以引用方法,属性或字段。它们都有自己的类型,继承自MemberInfo
,分别是MethodInfo
、PropertyInfo
和FieldInfo
。每种类型都有自己从目标实例获取值的方法(我将使用一个名为instance
的变量来引用所讨论的实例):
-
MethodInfo
—调用函数获取返回值,调用object value = methodInfo.Invoke(instance, parameters)
。关于parameters
应该是什么,请参阅链接页面。 -
PropertyInfo
—获取属性值,调用object value = propertyInfo.GetValue(instance, indexer)
。关于indexer
应该是什么,请参阅链接页面。 -
FieldInfo
-获取某字段的值,调用object value = fieldInfo.GetValue(instance)
。
TL;DR 以下版本:检查值是否为null,只需这样做:
if (value == null)
{
...
}
一旦获得了调用上述适当方法获得的值,就可以使用该值进行比较。当Nullable<T>
被装箱时,适用特殊规则;当Nullable<T>
的"null"值被装箱时,则返回一个实际的空引用。当一个非空的Nullable<T>
被装箱时,底层的值就是被装箱的东西(换句话说,Nullable<T>
的实例从来没有真正装箱到堆上)。下面的例子可能会让它更清晰一些:
int? foo = 10;
int? bar = null;
int baz = 10;
object value;
value = foo; // The integer 10 is boxed and placed on the heap
value = bar; // Nothing is boxed and value is set to null
value = baz; // The integer 10 is boxed and placed on the heap
由于这些特殊的规则,您可以将其与null
进行比较,看看它是否为空值,您可以直接强制转换为基本类型(如果它为空或不是该类型,将导致运行时异常),或者您可以进行条件强制转换回可空类型,这将返回您的可空值。
if (value == null)
{
...
}
或
int val = (int)value;
或
int? val = value as int?;
假设您的MemberInfo
是PropertyInfo
PropertyInfo prop = ...
object value = prop.GetValue(instance, null);
if (value != null)
{
...
}