如何在表达式中获取引用类型的值?

Jon*_*ger 4 .net c# lambda

我有这种方法:

public void DoSomething<T>(Expression<Func<T, object>> method)
{
}
Run Code Online (Sandbox Code Playgroud)

如果这样调用此方法:

DoSomething(c => c.SomeMethod(new TestObject()));
Run Code Online (Sandbox Code Playgroud)

...如何获取传递给SomeMethod()的参数的值?

如果参数是值类型,则可以使用:

var methodCall = (MethodCallExpression)method.Body;
var parameterValue = ((ConstantExpression)methodCall.Arguments[0]).Value;
Run Code Online (Sandbox Code Playgroud)

但是,当我传递引用类型时,methodCall.Arguments [0]是MemberExpression,而且我似乎无法弄清楚如何编写代码以从中获取值。

Jon*_*ger 5

这是答案(受阿卡什答案的启发):

LambdaExpression lambda = Expression.Lambda(methodCall.Arguments[0]);
var compiledExpression = lambda.Compile();
return compiledExpression.DynamicInvoke();
Run Code Online (Sandbox Code Playgroud)