0

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

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

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

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

4

1 回答 1

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

于 2013-11-14T02:37:58.240 回答