【发布时间】:2017-04-07 23:08:27
【问题描述】:
考虑像t => t.MyProperty 这样的属性表达式,其中t 的类型为MyClass。如何在执行方法调用的新表达式中使用此属性表达式?
纯C#:
class MyClass
{
public string MyProperty { get; set; }
}
static void Foo(string foo)
{
}
LambdaExpression GetExpression(Expression<Func<MyClass, object>> expr)
{
return expr;
}
var myClass = new MyClass();
Foo(myClass.MyProperty);
现在用表达式...?
var expr = GetExpression(m => m.MyProperty);
var mi = typeof(Program).GetMethod(nameof(Program.Foo),
BindingFlags.Public | BindingFlags.Static);
var myClass = new MyClass();
// Now what??
// var call = Expression.Call(mi, ???expr??);
// var invoke = Expression.Invoke(call, fooParameter);
我想使用expr 的结果并在对Foo 的调用中使用它。我知道我可以分两步执行此操作,我调用expr.Compile().DynamicInvoke(myClass) 来获取价值,但这不是我在这里要求的。
我想构建一个表达式,它接受一个属性 getter 表达式,然后调用表达式) 的Foo(result。我不知道如何将表达式用作方法调用的参数。
【问题讨论】:
-
根本不清楚您要达到的目标。方法
Foo采用string;你的Expression产生一个object。您想使用什么表达式作为调用什么方法的参数? -
如果我理解了,你应该就可以使用
Expression.Call(mi, Expression.Invoke( ... ))? -
这是挑战的一部分。可能需要转换。很清楚我想要达到的目标。对于给定的
MyClass对象 M,我想调用 Foo(M.MyProperty)。输入是由上述GetExpression方法生成的表达式。 -
明白了;给我一秒钟...
-
@l33t
Foo采用string,而Expression产生object。您是否想要在两者之间进行简单转换,因为您知道object实际上是string?
标签: c# lambda expression-trees