如何通过反射获取可空类型的值

20

我需要使用反射来检索 可空日期时间类型 的属性值。

我该如何做?

当我尝试使用 propertyInfo.GetValue(object, null) 时它不起作用。

谢谢

我的代码:

 var propertyInfos = myClass.GetType().GetProperties();

 foreach (PropertyInfo propertyInfo in propertyInfos)
 {
     object propertyValue= propertyInfo.GetValue(myClass, null);
 }

可空类型的propertyValue结果始终为null


5
以何种方式不起作用?说“它不工作”比描述它如何不工作要不太有帮助。 - Adam Robinson
贴一下不起作用的示例代码怎么样?并描述问题是什么?“不起作用”并不是最精确的描述。 - CodesInChaos
1
一个简短但完整的程序会非常有帮助... - Jon Skeet
1
你仍然缺少必要的代码。你的类是什么样子的,以及值是从null初始化为不同的值。一个能够编译并展示问题的程序会很好。 - CodesInChaos
2个回答

38
反射和Nullable<T>有些麻烦;反射使用object,而Nullable<T>针对object有特殊的装箱/拆箱规则。因此,当你有一个object时,它已经不再是Nullable<T>,它可能是null值本身

例如:

int? a = 123, b = null;
object c = a; // 123 as a boxed int
object d = b; // null

这有时会让人感到有些困惑,注意,如果您只有一个空的已装箱的Nullable<T>,那么您无法从中获取原始的T,因为您只有一个null

4
如果可空类型不为 null,您可以使用 Nullable.GetUnderlyingType(type) 获取包装的可空类型的基础类型。 - SeriousM

0

给定一个简单的类:

public class Foo
{
    public DateTime? Bar { get; set; }
}

还有代码:

Foo foo = new Foo();

foo.Bar = DateTime.Now;

PropertyInfo pi = foo.GetType().GetProperty("Bar");

object value = pi.GetValue(foo, null);

如果.Bar为null,则value为null,否则为DateTime值。你哪部分有问题?


1
它是一样的。"DateTime?"和"Nullable<DateTime>"是相同的东西。 - RQDQ
如果能解释为什么是这样的(就像Marc所做的那样),这个答案会更好。 - Adam Robinson
1
不起作用的是当我们想要获取值作为 Nullable<DateTime> 而不是 DateTime 时。如何使用反射来获得 Nullable<DateTime>(或任何类型的 Nullable<Xxxx>)。 - gentiane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接