创建访问属性的表达式

时间:2019-08-21 09:03:09

标签: c# lambda expression

我有以下课程:

internal class Sensors
{
    public JsonSensor<double> IOPcwFlSpr { get; set; } = new JsonSensor<double>();
 }

internal class JsonSensor<TType> : IJsonSensor
{
    public TType Value { get; set; }
}

我想构建一个检索该属性的表达式。

private static readonly List < PropertyInfo > Properties;

static SensorFactory() {
    Properties = typeof(Json.Sensors).GetProperties().ToList();
}

public void Test(Json.Sensors jsonUpdate) {
    foreach(var property in Properties) {
        var getterMethodInfo = property.GetGetMethod();
        var parameterExpression = Expression.Parameter(jsonUpdate.GetType(), "x");
        var callExpression = Expression.Call(parameterExpression, getterMethodInfo);

        var lambda = Expression.Lambda < Func < JsonSensor < double >>> (callExpression);
        var r = lambda.Compile().Invoke();
    }
}

抛出:

  

System.InvalidOperationException:类型为'Sensors'的变量'x'   从范围“”引用,但未定义

这很有意义,因为我从来没有给'x'分配实际的对象。如何添加“参数对象”?

1 个答案:

答案 0 :(得分:4)

使用这样的表达式树时,关键是使用参数(ParameterExpression一次编译,创建一个Func<Foo,Bar>来接受您的输入({{1} })并返回您想要的任何内容(Foo)。然后,使用不同的对象多次重复使用已编译的委托。

我看不到确切地您正在尝试做什么,但是我想那应该是这样的:

Bar