c# - 无需调用即可从 lambda 获取方法名称

标签 c# lambda expression-trees

我想从 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 方法来检查给定的表达式并从中提取方法组的名称。但是,您应该记住两件事。

  1. 即使您的 lambda 表达式看起来“调用”了一个方法,它也只是一个表达式,实际上不会生成对该方法的调用。
  2. 尝试以这种方式捕获方法组将很难区分具有相同名称的重载方法。

出于这个原因,我不得不想象您最好使用更传统的方法,确实涉及方法调用表达式。

关于c# - 无需调用即可从 lambda 获取方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25185686/

相关文章:

c# - 浏览器偶尔会在回发和重定向后丢失用于身份验证的 HttpCookie

c# - 是否可以在不包括阻塞/抢占时间的情况下测量线​​程的执行时间?

Java:捕获 lambda 异常

python - Python 中的代码块

c# - 如何从带有 MethodCallExpression/lambda 的树中的 ConditionalExpression.IfThen 返回?

c# - OutOfMemoryException 何时发生?

c# - 调试 WPF 时遇到问题

Kotlin fun() vs lambda 有区别吗?

c# - 使用表达式从 Lambda 创建安全的深层属性访问器

c# - 查找 NewArrayExpression 的大小