2011-03-02 5 views
1

J'ai le code suivant qui est une méthode privée dans le formulaire et récupère tous les menus contextuels du formulaire. Je pense que ce n'est pas aussi concis qu'il devrait l'être. Serait reconnaissant pour toute suggestion.Récupération des valeurs des champs qui ont spécifié le type

private IEnumerable<ContextMenuStrip> GetContextMenus() 
    { 
     var type = this.GetType(); 
     var fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
     var contextMenus = fields.Where(f => f.GetValue(this).GetType() == typeof(ContextMenuStrip)); 
     var menus = contextMenus.Select(f=> f.GetValue(this)); 
     return menus.Cast<ContextMenuStrip>();   
    } 

Répondre

3

Êtes-vous content d'inclure des sous-classes de ContextMenuStrip? Si oui, j'utiliser:

return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
       .Select(field => field.GetValue(this)) 
       .OfType<ContextMenuStrip>(); 
+0

Merci pour la grande réponse! – Peter17

1
var query = (from f in GetType().GetFields(
       BindingFlags.NonPublic | BindingFlags.Instance) 
      select f.GetValue(this)).OfType<ContextMenuStrip>(); 
+0

Merci. J'ai deux réponses avec deux styles différents d'interrogation. Les deux sont géniaux. Je ne sais pas lequel je devrais accepter. :) – Peter17

0

Si ce code est sous une forme, vous voudrez peut-être d'éviter une réflexion tout à fait, et boucle un peu plus de la collection Controls, quelque chose comme:

var controls = from Control c in Controls.AsQueryable() 
       where c is ContextMenuStrip 
       select c; 

ou la variante non LINQed

IEnumerable<ContextMenuStrip> result = new List<ContextMenuStrip>(); 
foreach (var control in Controls) 
{ 
    ContextMenuStrip menuStrip = (control as ContextMenuStrip) 
    if (menuStrip != null) 
    { 
    result.Add(menuStrip); 
    } 
} 
return result; 
+0

Regarder les champs est différent de regarder la collection de contrôles. Tous les contrôles ne sont pas des champs, et tous les champs ne sont pas (directement) dans la collection Controls (même s'il s'agit de contrôles). Donc, une réponse valide, mais il fait quelque chose de différent. –

+0

Je suis tout à fait d'accord, mais la réflexion peut généralement être une exagération. J'admets que le PO était explicite au sujet des champs, mais je vais laisser cette réponse ici si quelqu'un trébuche dessus en premier. BTW, un champ int ne sera pas dans la collection de contrôles, mais comment un contrôle ne peut-il pas être un champ? – SWeko

Questions connexes