2009-01-10 8 views
1

J'ai une énumération pour Statut pour une tâche. Certains des statuts sont considérés comme obsolètes, et je les ai marqués comme obsolète, comme on le voit ci-dessous:Comment inspecter ou rechercher les attributs .NET?

public enum TaskStatus 
{ 
    [Description("")] 
    NotSet = 0, 
    Pending = 1, 
    Ready = 2, 
    Open = 3, 
    Completed = 4, 
    Closed = 5, 
    [Description("On Hold")][Obsolete] 
    OnHold = 6, 
    [Obsolete] 
    Canceled = 7 
} 

Dans mon interface utilisateur je remplir une liste déroulante avec des valeurs sur les énumérations, mais je veux ignorer ceux qui sont marqué comme obsolète. Comment pourrais-je faire ça?

Répondre

3

Vous pouvez écrire un LINQ-requête:

var availableTaks = typeof (TaskStatus).GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public) 
    .Where(f => f.GetCustomAttributes(typeof (ObsoleteAttribute), false).Length == 0); 
foreach(var task in availableTaks) 
    Console.WriteLine(task); 
+0

Merci! Travaillé parfaitement! – mattruma

0

Vous pouvez utiliser le DebuggerHiddenAttribute et je sais qu'il y en a un qui le fait cacher de l'explorateur de propriétés, mais n'arrive pas à se souvenir du nom.

1
Type enumType = typeof(testEnum); 
enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)[i].GetCustomAttributes(true); 

Ensuite, vous pouvez utiliser votre choix de la méthode en boucle à travers le réseau et vérifier s'il y a des attributs personnalisés.

+0

heh on dirait que j'étais vraiment lent cette fois-ci ... la méthode linq est sympa ;-) – JoshBerke

+0

bienvenue et merci ... une autre utilisation soignée de ce que j'ai trouvé était de stocker un nom d'affichage ... Donc vous pouvez afficher sur Tenez au lieu de OnHold. Aussi, si vous voulez le localiser, il vous suffit de stocker la clé pour le fichier de ressources ... – JoshBerke

Questions connexes