我正在尝试使用.Net闭包将函数的方法名称传递给对象,如下所示:
方法签名
public IEnumerable<T> GetData<T>(Func<IEnumerable<T>> WebServiceCallback)
where T : class
{
// either gets me '<LoadData>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(..)等
答案 0 :(得分:14)
您正在查看lambda表达式的名称(由编译器生成),而不是lambda中调用的方法的名称。
您必须使用<Expression<Func<T>>
而不是Func<T>
。表达式可以被解析和分析。
尝试
public IEnumerable<T> GetData<T>(Expression<Func<IEnumerable<T>>> callbackExpression)
where T : class
{
var methodCall = callbackExpression.Body as MethodCallExpression;
if(methodCall != null)
{
string methodName = methodCall.Method.Name;
}
return callbackExpression.Compile()();
}
答案 1 :(得分:1)
实际传递给你的函数的是一个匿名的lambda函数(() => WCFService.Etc
),所以你看到的是实际的方法名称 - <LoadData>b__3
是匿名方法的自动生成的名称。 / p>
你真正想要的是名为 inside 方法的方法。为此,您需要深入研究表达式。而不是Func<IEnumerable<T>>
,将参数定义为Expression<Func<IEnumerable<T>>>
,并调用此代码:
var body = nrdsWebServiceCallback.Body as MethodCallExpression;
if (body != null)
Console.WriteLine(body.Method.DeclaringType.Name + "." + body.Method.Name);