1

下面的代码在 .Net 3.5 上运行良好:

PropertyInfo propertyInfo = typeof(int?).GetProperty("Value");
int? i = 5;
object o = propertyInfo.GetValue(i, null);

运行后,o是 typeint并具有 value 5。这没关系。

当我在 .Net Compact Framework 3.5 上运行相同的代码时,我InvalidProgramException在最后一行得到一个。

  • 为什么会这样?
  • 我能做些什么吗?
  • 这是 .Net CF 中的错误吗?

我目前正在做的是确定Type我正在处理的是否是 aSystem.Nullable<T>并且我得到的属性具有名称"Value",然后明确处理该情况。但我想知道是否有更简单的解决方案。

我正在编写的代码解析表达式树(我们使用System.Linq.Expressions在 .Net CF 上实现的单声道 dll)。当我使用反射来获取ConstantExpression表示可空常量的 a 的值时,就会出现问题。

4

1 回答 1

2
  • 为什么会这样?
    特别是因为当您查询它时它i是一个 int,而不是一个可为空的(继续做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 中的错误吗?
    这绝对是行为差异。您必须查看 ECMA 规范才能了解它的行为方式。可能它实际上在桌面上并不正确,或者行为实际上没有定义,因此两者都不是“正确”或“错误”。令人惊讶的是,我见过 CF 正确而桌面错误的情况。

于 2013-05-23T15:30:40.803 回答