【发布时间】:2019-08-21 09:03:09
【问题描述】:
我有以下课程:
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:“传感器”类型的变量“x” 从范围 '' 中引用,但未定义
这是有道理的,因为我从未将“x”分配给实际对象。如何添加“参数对象”?
【问题讨论】:
-
你想要它是一个参数吗?还是你想让它成为一个常数?注意:如果您只想编译并使用它一次,那么创建表达式真的毫无意义-您不妨只使用反射;你有什么理由要在这里使用表达式吗?您打算稍后缓存它们吗?因为如果你要缓存它们:输入是一个参数是有意义的
-
退后一步;忘记这里的实际代码;您在这里真正想要实现的目标是什么?如果它只是“更快地访问属性” - 也许像 FastMember 这样的东西可能是一个更简单的选择?
-
附加说明:这些值是否总是
JsonSensor<double>?或者他们可以是JsonSensor<int>等?它有点改变了一些事情 -
@MarcGravell,也许我做错了。我有一个具有 100 多个属性的类(通过 json 反序列化)。每个属性代表机器中的一个传感器。每次收到新的更新时,我都想更新我自己的传感器对象 [b]list[/b] 中的新传感器值。因此,我认为最好使用反射来获取“具有 100 多个传感器属性的 json 类”的所有属性,并使用表达式解析属性
-
是的,JsonSensor 是通用的。双/int/bool
标签: c# lambda expression