簡體   English   中英

如何獲取泛型函數的方法名<t>傳入方法</t>

[英]How to get Method Name of Generic Func<T> passed into Method

我正在嘗試使用 .Net 閉包將 function 的方法名稱傳遞給 object,如下所示:

方法簽名

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(..) 等

您正在查看 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()();
}

實際傳遞給您的函數的是匿名 lambda 函數 ( () => WCFService.Etc ),因此您看到的是實際方法名稱 - <LoadData>b__3是匿名方法的自動生成名稱。

你真正需要的是被稱為調用的方法的方法。 為此,您需要深入研究表達式。 而不是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);

這是另一種解決方法:

因為您正在使用回調(匿名函數),這是其名稱在.Method.Name屬性中表示的.Method.Name

您可以使用 RegEx 從中獲取方法的名稱:

/// <summary>
/// Gets a string between the characters '<' and '>' 
/// Which is the method name for anonymous methods.
/// </summary>
/// <param name="methodName"></param>
/// <returns>Simple method name</returns>
private static string GetMethodName(string methodName)
{
    var pattern = @"(?<=\<)(.*?)(?=\>)";
    var regex = new Regex(pattern);

    return regex.Match(methodName).Value;
}

它將采用字符串: <LoadData>b__3

並返回函數名: LoadData

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM