Action.ToString()可以返回“System.Action”以外的任何内容吗?

时间:2011-10-13 16:33:02

标签: c# action tostring

我在Unity中编程,使用Action事件来保存一堆其他Action委托,以便将非Monobehaviour对象挂钩到Update()系统中。我希望能够将操作的名称打印到Debug控制台,但是使用类似的东西:

Delegate[] actions = updateActions.GetInvocationList();
foreach ( Delegate del in actions ) {
    Debug.Log( del.ToString() );
}

...只返回“System.Action”。我也试过(del as Action).ToString()没有运气。

2 个答案:

答案 0 :(得分:5)

您可以使用Method属性获取一个应该有一个有用名称的MethodInfo

Delegate[] actions = updateActions.GetInvocationList();
foreach ( Delegate del in actions )
{
    Debug.Log( del.Method.ReflectedType.FullName + "." + del.Method.Name );
}

如果您需要签名,可以使用del.Method.ToString();如果您只想要名称,可以使用del.Method.Namedel.Method.ReflectedType.FullName为您提供了类型名称。

对于lambdas / anonymous方法,名称可能不太有用,因为它们只有编译器生成的名称。在当前实现中,lambda的名称类似于<Main>b__0,其中Main是包含lambda的方法的名称。与类型名称一起,这应该给你一个体面的想法,它是什么lambda。

答案 1 :(得分:1)

如果您的意思是宣布委托

var foo = new Action(() => { /* do something */ });

你想要稍后检索“foo”这个词,你运气不好。要获得该行为,您必须将声明作为表达式树使用,并自己解析foo