Может ли Action.ToString () возвращать что-либо кроме «System.Action»? - PullRequest
3 голосов
/ 13 октября 2011

Я программирую в Unity, используя событие Action для хранения группы других делегатов Action, чтобы подключить объекты, не относящиеся к моноблоку, в систему Update ().Я хотел бы иметь возможность печатать имена действий в консоли отладки, но используя что-то вроде:

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

... просто возвращает «System.Action».Я также пытался (del как Action) .ToString () без удачи.

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

Вы можете использовать свойство 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.Name, если выхочу только имя.del.Method.ReflectedType.FullName дает вам имя типа.

Для лямбда-выражений / анонимных методов имя может быть не слишком полезным, поскольку они имеют только имя, сгенерированное компилятором.В текущей реализации имя лямбды выглядит примерно так: <Main>b__0, где Main - это имя метода, который содержит лямбду.Вместе с именем типа это должно дать вам приличное представление о том, что это за лямбда.

1 голос
/ 13 октября 2011

Если вы имеете в виду, что объявляете делегата

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

и вы хотите получить слово "foo" позже, вам не повезло. Чтобы получить такое поведение, вам нужно использовать объявление в виде дерева выражений и самостоятельно разобрать foo.

...