12
votes

C # ou vb.net - Itéréter tous les énums publics

Nous avons un composant commun dans notre source qui contient toutes les énumes (environ 300!) pour une très grande application.

Y a-t-il un moyen, en utilisant c # ou vb.net, pour les utiliser à tous afin d'effectuer une action sur chacun?

La question Comment itérer tout " String publique "Propriétés dans une classe .NET est presque pertinente, mais les Enums que je traite sont un mélange de types


0 commentaires

5 Réponses :


2
votes

Une fois que toutes vos assemblées sont chargées, vous pouvez itérer à chaque assemblage et appeler gettypes () pour renvoyer tous les types (vous pouvez également obtenir des types privés aussi, bien que cela faudra plus longtemps). Vous pouvez filtrer les types par isenum pour obtenir uniquement ceux qui sont des types d'énumjet. Notez que cela retournera également tous les types de BCL Enum. Si vous ne voulez pas les types de BCL, vous devrez les filtrer. Vous pouvez vous débarrasser de la plupart en ignorant les assemblées dont les noms commencent par «Système». Alternativement, vous pouvez vérifier que le chemin contient votre chemin local, en supposant que tous vos assemblages de projet sont locaux de votre EXE.


0 commentaires

3
votes

Cela devrait vous aider à démarrer. Itérer à travers les types dans les assemblages chargés; et vérifier si elles sont une énumération: xxx


2 commentaires

Cela donne une erreur d'exécution: Impossible de lancer l'objet de type 'WhayRayiterator 1 [System.tpe]' Pour taper "System.type'."


@Shevek j'ai eu la même exception. En fait, j'ai trouvé cette question lorsque vous recherchez la cause de cette exception dans un autre contexte. Ceci est résolu en remplaçant Select par SelectMany. J'ai mis à jour la réponse.



19
votes

quelque chose sur ces lignes?

var query = Assembly.GetExecutingAssembly()
                    .GetTypes()
                    .Where(t => t.IsEnum && t.IsPublic);

foreach (Type t in query)
{
    Console.WriteLine(t);
}


4 commentaires

Je vais ceci pour fonctionner (en utilisant var a = assembly.load ("myassembly"); et requête var requête = A.getTypes (). Où (t => t.isenum && t. Ispublic); ) mais comment puis-je les utiliser alors? Tous les t sont de type system.runtimetype et je veux les utiliser comme Enums (très nouveau à toutes ces trucs de réflexion!)


@Shevek: C'est une question différente. Que voulez-vous faire exactement avec toutes ces énumes différentes?


J'ai besoin d'itérer chacun des énums et de générer un script d'insertion SQL pour créer une table de recherche.


J'ai compris! var valeurs = nouvelle liste (); var nom = nouvelle liste (); noms.addrange (Enum.getNames (t)); valeurs.addrange ((iEnumerable ) Enum.getvalues ​​(T));



2
votes

En supposant que vous ayez l'assemblage sur lequel réside l'ENUMS. xxx


0 commentaires

2
votes

Si vous avez tous les Enums compilé dans un enum commun , vous pouvez utiliser quelque chose sur les lignes de ceci: xxx

Cela peut vous aider à démarrer le bon chemin.


0 commentaires