使用反射获取System.Nullable. net紧凑框架
本文关键字:net 框架 反射 获取 System Nullable | 更新日期: 2023-09-27 18:15:12
下面的代码在。net 3.5上运行良好:
PropertyInfo propertyInfo = typeof(int?).GetProperty("Value");
int? i = 5;
object o = propertyInfo.GetValue(i, null);
运行后,o
类型为int
,值为5
。
当我在。net Compact Framework 3.5上运行相同的代码时,我在最后一行得到InvalidProgramException
。
- 为什么会这样? 有什么我能做的吗?这是。net CF中的一个bug吗?
我目前正在做的是确定我正在处理的Type
是否为System.Nullable<T>
,并且我正在获得的属性名称为"Value"
,然后显式处理该情况。但我想知道是否有更简单的解决办法。
我正在编写的代码解析表达式树(我们使用mono dll在。net CF上实现System.Linq.Expressions
)。当我使用反射来获取代表可空常量的ConstantExpression
的值时,就会出现问题。
- 为什么会这样?
特别是当你查询它时i
是一个整型,而不是一个可空的(继续执行i.GetType()
,看看我的意思)所以CF看到你试图读取一个不存在于你传入 的对象上的属性 我能做些什么吗?
这取决于您的用例。在这个确切的场景中,可能没有——框架按照它的方式运行,您无法更改它。也就是说,我在OpenNETCF ORM中使用可空类型,所以我去看看它是如何工作的,它们的"关键"似乎是我支持的可空类型是我使用的类中的属性。class Foo { public int? i { get; set; } } static class Program { static void Main() { var f = new Foo(); var p = f.GetType().GetProperty("i", BindingFlags.Instance | BindingFlags.Public); f.i = 5; var v = p.GetValue(f, null); p.SetValue(f, 3, null); } }
这是。net CF中的一个bug吗?
这绝对是一种行为差异。你必须看看ECMA规范,看看它应该如何表现。有可能它在桌面上实际上是不对的,或者行为实际上没有定义,所以没有一个是"对的"或"错的"。令人惊讶的是,我见过CF是正确的,而桌面不是。