我需要在这个问题前面加上声明,说到动态表达式时我是个菜鸟。
我们有一些现有的代码可以查看对象,然后使用动态表达式检索该对象的属性值:
var lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(instance.GetType(), typeof(object), newExpression.Trim());
var result = lambda.Compile().DynamicInvoke(instance);
我想知道是否可以为该属性设置一个值?这是检索结果(实际上是表达式的结果,即属性值),但我想改为设置属性值。不确定我在这里咆哮完全错误的树。
答案 0 :(得分:1)
你真的很亲近 - 只需要使用以下内容:
var param = Expression.Parameter(typeof(T), "instance");
var lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { param }, typeof(object), newExpression.Trim());
var assign = Expression.Lambda<Action<T>>(Expression.Assign(Expression.Property(param, "Property"), lambda.Body)), param);
assign.Compile().Invoke(instance);
可能你需要稍微改变一下类型,你可以从Lambda和DynamicInvoke而不是Invoke中删除泛型。我正在使用MakeGenericType,GetConstructor等创建的泛型对象中强类型。