如何获取传递给方法</t>的泛型Func <t>的方法名称

时间:2013-12-06 09:31:49

标签: c# generics func

我正在尝试使用.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(..)等

2 个答案:

答案 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);