![](/img/trans.png)
[英]Get info about caller and parameters (name and value) of a Func<T> 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.