簡體   English   中英

獲取Action / Func Delegate的名稱

[英]Get Name of Action/Func Delegate

我有一個奇怪的情況,我需要將委托的名稱作為字符串。 我有一個看起來像這樣的通用方法。

private T Get<T>(T task, Action<T> method) where T : class
{
  string methodName = method.Method.Name //Should return Bark
}

而我這樣稱呼它

private void MakeDogBark()
{
  dog = Get(dog, x=>x.Bark());
}

但不是看到“樹皮”,而是看到"<MakeDogBark>b__19" 所以看起來它給了我初始調用的方法名稱而不是委托的名稱。

有人知道怎么做嗎?

它為您提供了該方法的名稱,該方法是委托的操作。 這恰好是使用lambda表達式實現的。

你現在有一個代表,后者調用了Bark。 如果你想直接使用Bark ,你需要為Bark方法創建一個開放的委托,這可能不是非常簡單。 那是假設你真的想要打電話給它。 如果您不需要調用它,或者您知道它將在第一個參數上調用,您可以使用:

private T Get<T>(T task, Action method) where T : class
{
   string methodName = method.Method.Name //Should return Bark
}

private void MakeDogBark()
{
   dog = Get(dog, dog.Bark);
}

可以通過使參數成為表達式樹而不是委托來繞過這個,但是只有當lambda表達式只是一個方法調用時它才會起作用。

您可以通過使參數成為表達式而不是委托來獲取方法調用的名稱,就像Jon提到的那樣

private T Get<T>(T task, Expression<Action<T>> method) where T : class
{
    if (method.Body.NodeType == ExpressionType.Call)
    {
        var info = (MethodCallExpression)method.Body;
        var name = info.Method.Name; // Will return "Bark"
    }

    //.....
}

暫無
暫無

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

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