如何获取传递给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
),所以你看到的是实际的方法名称 –
是匿名方法的自动生成的名称。
你真正想要的是在方法中调用的方法。 为此,您需要深入研究表达式。 而不是Func
,将您的参数定义为Expression
,并调用此代码:
var body = nrdsWebServiceCallback.Body as MethodCallExpression; if (body != null) Console.WriteLine(body.Method.DeclaringType.Name + "." + body.Method.Name);