如何检查可空类型是否具有来自MemberInfo的值

本文关键字:是否 的值 MemberInfo 类型 何检查 检查 | 更新日期: 2023-09-27 18:06:51

如果我有一个可空类型的MemberInfo,我怎么能确定它是否已被分配一个值?

如何检查可空类型是否具有来自MemberInfo的值

MemberInfo没有获取值的方法,因为MemberInfo可以引用方法,属性或字段。它们都有自己的类型,继承自MemberInfo,分别是MethodInfoPropertyInfoFieldInfo。每种类型都有自己从目标实例获取值的方法(我将使用一个名为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?;

假设您的MemberInfoPropertyInfo

PropertyInfo prop = ...
object value = prop.GetValue(instance, null);
if (value != null)
{
    ...
}