创建Func以返回reference和value类型

时间:2016-01-15 12:49:45

标签: c# expression-trees

我有一个方法返回由表达式构建的Func<object>,如下所示:

var expr = Expression.Property(
        Expressions.Expression.Constant(new Foo { Name = "Hans", Age = 3 }, typeof(Foo)), 
        "Age");
var f = Expression.Lambda<Func<object>>(expr).Compile();

此表达式应返回此虚拟Age - 对象的Foo - 属性。问题是因为我想要返回Func<object>而不是Func<int>我得到了

  

ArgumentException:类型System.Int32的表达式不能用作返回类型System.Object。 (或类似的东西,有德语版本)。

如果我选择Name - 属性而不是Age - 属性同样有用。我知道这与装箱和拆箱有关,因为int不会延长object

但是,如何返回表示value-type-property的适当函数?

1 个答案:

答案 0 :(得分:4)

您可以使用Expression.Convert将整数转换为object,如下所示:

var expr = Expression.Convert(
    Expression.Property(
        Expression.Constant(
            new Foo {Name = "Hans", Age = 3},
            typeof (Foo)),
        "Age"),
    typeof(object));