我有以下课程:
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'分配实际的对象。如何添加“参数对象”?
答案 0 :(得分:4)
使用这样的表达式树时,关键是使用参数(ParameterExpression
一次编译,创建一个Func<Foo,Bar>
来接受您的输入({{1} })并返回您想要的任何内容(Foo
)。然后,使用不同的对象多次重复使用已编译的委托。
我看不到确切地您正在尝试做什么,但是我想那应该是这样的:
Bar