如何获取传递给Method的Generic Func 的方法名称

我正在尝试使用.Net闭包将函数的方法名称传递给对象,如下所示:

方法签名

public IEnumerable GetData(Func<IEnumerable> WebServiceCallback) where T : class { // either gets me 'b__3' var a = nrdsWebServiceCallback.Method.Name; var b = nrdsWebServiceCallback.GetInvocationList(); return WebServiceCallback(); } 

我这样称呼它:

 SessionStateService.Labs = CacheManager.GetData(() => WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2)); 

看到’b__3’而不是WCFServce.GetLabs(..)等

您正在查看lambda表达式的名称(由编译器生成),而不是lambda内部调用的方法的名称。

您必须使用>而不是Func 。 表达式可以被解析和分析。

尝试

 public IEnumerable GetData(Expression>> callbackExpression) where T : class { var methodCall = callbackExpression.Body as MethodCallExpression; if(methodCall != null) { string methodName = methodCall.Method.Name; } return callbackExpression.Compile()(); } 

实际传递给你的函数的是一个匿名的lambda函数( () => WCFService.Etc ),所以你看到的是实际的方法名称 – b__3是匿名方法的自动生成的名称。

你真正想要的是在方法中调用的方法。 为此,您需要深入研究表达式。 而不是Func> ,将您的参数定义为Expression>> ,并调用此代码:

 var body = nrdsWebServiceCallback.Body as MethodCallExpression; if (body != null) Console.WriteLine(body.Method.DeclaringType.Name + "." + body.Method.Name);