使用反射获取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的值时,就会出现问题。

使用反射获取System.Nullable<T>. net紧凑框架

  • 为什么会这样?
    特别是当你查询它时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是正确的,而桌面不是。