C# 如何获取泛型函数的方法名<;T>;传入方法

C# 如何获取泛型函数的方法名<;T>;传入方法,c#,generics,func,C#,Generics,Func,我尝试使用.Net闭包获取传递到对象的函数的方法名,如下所示: SessionStateService.Labs = CacheManager.GetData(() => WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2)); 方法签名 public IEnumerable<T> GetData<T>(Func<IEnumerable<T>> We

我尝试使用.Net闭包获取传递到对象的函数的方法名,如下所示:

SessionStateService.Labs = CacheManager.GetData(() =>  
WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2));
方法签名

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();
}

看到的是“b__3”而不是WCFServce.GetLabs(..)等

您看到的是lambda表达式的名称(由编译器生成),而不是lambda中调用的方法的名称


您必须使用一个
实际传递到函数中的是一个匿名lambda函数(
()=>WCFService.Etc
),因此您看到的是实际的方法名称-
b_u3
是匿名方法的自动生成名称

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

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

阅读这篇文章会对您有所帮助:虽然可以通过解析表达式树来获得名称,但为什么需要它呢?您可以获得
b_uu3
,因为这是编译器生成的函数的名称。您的学员对
WCFService.GetLabs
一无所知,它完全包含在
b\uu 3
中。您为什么需要它?用于日志记录。
返回WebServiceCallback()
不会这样编译,因为您删除了
WebServiceCallback
@hvd谢谢,我没有注意到这一点。刚刚修好了。现在看来,作为对所问问题的回答,我觉得不错。不过,我对OP想要分析函数的根本问题表示怀疑,但鉴于问题中包含的信息有限,对此没有什么可说的。@hvd Me也一样-表达式分析只需要解决一些非常具体的问题。也许他只是在探索语言?@BarryMcDermid根据您的服务的结构,让它依赖于
typeof(T)
就足够了。如果多个服务返回相同的类型,我个人倾向于将其写为
SessionStateService.Labs=CacheManager.GetData(WCFService.GetLabs,SessionStateService.var1,SessionStateService.var2)其中第一个参数是委托(不是表达式树)。
var body = nrdsWebServiceCallback.Body as MethodCallExpression;
if (body != null)
   Console.WriteLine(body.Method.DeclaringType.Name + "." + body.Method.Name);