#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 для общего обзора.