如果我有MemberInfo
可空类型,我如何确定它是否已分配值?
答案 0 :(得分:2)
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>
的“空”值被加框时,则返回实际的空引用。当盒装非空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
进行比较以查看它是否为空值,您可以直接转换为基本类型(如果它是null或不是该类型,将导致运行时异常),或者你可以将一个条件强制转换回可以为空的类型,这将返回你的可空值。:
if (value == null)
{
...
}
或
int val = (int)value;
或
int? val = value as int?;
答案 1 :(得分:1)
假设您的MemberInfo
是PropertyInfo
PropertyInfo prop = ...
object value = prop.GetValue(instance, null);
if (value != null)
{
...
}