我想从 lambda 表达式中获取方法名称,我知道可以通过这种方式完成:
GetName(() => MethodA());
我的问题是,如果 MethodA
接受任何参数,您必须提供它们只是为了满足编译器对表达式的要求(毕竟,它怎么知道您实际上没有执行它?)
我希望能够做到:
GetName(() => MethodA);
有没有办法做到这一点?
注意:这不是重复,这是处理方法组
而不是方法的实际“调用”。
最佳答案
当然。如果您有 GetName 方法,请使用 Expression<Func<Action>>
作为参数,例如,那么您可以传递 () => MethodA
进入其中,只要 MethodA 可转换为与 Action
相同的委托(delegate)签名.
void Main()
{
Expression<Func<Action>> x = () => Foo;
Expression<Func<Func<int>>> y = () => Foo2;
var xName = ((MethodInfo)((ConstantExpression)((MethodCallExpression)((UnaryExpression)x.Body).Operand).Object).Value).Name;
}
void Foo(){}
int Foo2(){return 0;}
您可以编写 GetName 方法来检查给定的表达式并从中提取方法组的名称。但是,您应该记住两件事。
- 即使您的 lambda 表达式看起来“调用”了一个方法,它也只是一个表达式,实际上不会生成对该方法的调用。
- 尝试以这种方式捕获方法组将很难区分具有相同名称的重载方法。
出于这个原因,我不得不想象您最好使用更传统的方法,确实涉及方法调用表达式。
关于c# - 无需调用即可从 lambda 获取方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25185686/