Может ли действие.toString() возвращает что-либо, кроме «System.Действие»?

#c# #action #tostring

#c# #Экшен #tostring

Вопрос:

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

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

… просто возвращает «System.Действие». Я также пробовал (del как действие).toString() безуспешно.

Комментарии:

1. Что такое name of the action ?

Ответ №1:

Вы можете использовать Method свойство, чтобы получить a 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 примерно так: where Main — имя метода, содержащего лямбда-выражение. Вместе с именем типа это должно дать вам хорошее представление о том, что это за лямбда.

Ответ №2:

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

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

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

Комментарии:

1. Что, если я хочу получить (для целей отладки) часть () => { /* do something */ } ?

2. Вы не можете получить точный текст (например, комментарий), но вы можете присвоить эту лямбду an Expression<Action> и получить AST. См msdn.microsoft.com/en-us/library/bb397951.aspx для общего обзора.