2011-10-13 3 views
3

Je suis en train de programmer dans Unity, en utilisant un événement Action pour contenir un tas d'autres délégués Action, afin de connecter des objets non-Monobehaviour dans le système Update(). Je voudrais être en mesure d'imprimer les noms des actions à la console de débogage, mais en utilisant quelque chose comme:Est-ce que Action.ToString() peut renvoyer autre chose que "System.Action"?

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

... juste retour « System.Action ». J'ai essayé aussi (del as Action) .ToString() sans chance.

+0

Qu'est-ce que 'nom de l'action'? – sll

Répondre

5

Vous pouvez utiliser la propriété Method pour obtenir un MethodInfo qui devrait avoir un nom utile.

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

Vous pouvez utiliser del.Method.ToString() si vous souhaitez que la signature ou del.Method.Name si vous ne souhaitez que le nom. del.Method.ReflectedType.FullName vous donne le nom du type.

Pour les méthodes lambdas/anonymes, le nom n'est peut-être pas trop utile car il ne possède qu'un nom généré par le compilateur. Dans l'implémentation actuelle, le nom d'un lambda est quelque chose comme <Main>b__0Main est le nom de la méthode qui contient le lambda. Avec le nom du type, cela devrait vous donner une bonne idée de ce qu'est le lambda.

+0

Cela me semble être une bonne solution. –

+0

Fonctionne bien - merci! –

1

Si vous voulez dire que vous déclarez un délégué

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

et que vous voulez récupérer le mot « foo » plus tard, vous êtes hors de la chance. Pour obtenir ce comportement, vous devrez utiliser la déclaration comme arbre d'expression et analyser vous-même foo.

+0

Et si je veux obtenir (à des fins de débogage) la partie '() => {/ * faire quelque chose * /}'? – Joel

+1

Vous ne pouvez pas obtenir le texte exact (par exemple le commentaire), mais vous pouvez affecter ce lambda à une expression et sortir l'AST. Voir http://msdn.microsoft.com/en-us/library/bb397951.aspx pour une vue d'ensemble de base. – mquander

+0

Merci, monsieur. +1 – Joel

Questions connexes