DynamicExpression.ParseLambda 用于在对象上设置值

本文关键字:设置 对象 ParseLambda 用于 DynamicExpression | 更新日期: 2023-09-27 18:33:02

我需要在这个问题的开头声明,在动态表达式方面我是一个菜鸟。

我们有一些现有的代码,可以查看一个对象,然后使用动态表达式检索该对象的属性值:

var lambda = System.Linq.Dynamic.DynamicExpression.ParseLambda(instance.GetType(), typeof(object), newExpression.Trim());
var result = lambda.Compile().DynamicInvoke(instance);

我想知道是否可以为该属性设置一个值? 这是检索一个结果(实际上是作为属性值的表达式的结果),但我想改为设置一个属性值。 不确定我在这里吠叫完全错误的树。

DynamicExpression.ParseLambda 用于在对象上设置值

你真的很接近那里 - 只需要遵循以下内容:

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等创建的泛型对象中进行强类型化。