2013-06-29 4 views
2

J'ai une application WinForms avec plusieurs commandes d'éléments de menu qui correspondent au même gestionnaire. J'utilise la propriété Tag des éléments de menu pour identifier le comportement du gestionnaire. Le problème est que le paramètre sender du gestionnaire est de type object. Alors, comment lire la propriété Tag d'un objet?Comment accéder en toute sécurité à la propriété de l'objet

Je sais que je peux classer sender au type de mon élément de menu, mais que se passe-t-il si je veux qu'un bouton ou un autre contrôle soit mappé au même gestionnaire? Existe-t-il un moyen générique de lire la propriété Tag à partir de n'importe quel objet est l'expéditeur?

Voici ce que j'ai jusqu'ici. Cela semble fonctionner. Mais n'y a-t-il pas une manière plus simplifiée?

private void Header_Click(object sender, EventArgs e) 
{ 
    dynamic ctrl = sender as dynamic; 
    if (ctrl != null && sender.GetType().GetProperty("Tag") != null) 
    { 
     // Go ahead and reference ctrl.Tag 
    } 
} 

Répondre

2

Vous pourriez lancer est le type de parent de tous les contrôles plutôt que l'enfant spécifique.

Control ctrl = sender as Control; 
if (ctrl != null) 
    MessageBox.Show(ctrl.Tag.ToString()); 
+0

C'est ce que je pensais. Mais apparemment les éléments de menu ne dérivent pas de 'Control'. –

+1

@Jonathan alors essayez quelques choses via 'as' - ou si vous êtes sûr qu'il a un .Tag, vous pouvez le transformer en' dynamic' –

+0

@MarcGravell: Je pensais que je le transformais en 'dynamic'. –

1

Si la chose que vous écoutez toujours un .Tag, alors vous pourriez aussi bien le type de canard:

dynamic ctrl = sender; 
object tag = ctrl.Tag; 

utilisant la réflexion (comme dans la question) défaites tout point dans l'utilisation dynamic .

+0

C'est essentiellement ce que fait mon code. La seule différence est la vérification de la réflexion pour se prémunir contre une exception si l'objet ne supporte pas une propriété 'Tag'. –

Questions connexes