Récupération des constantes d'un type à l'aide de la réflexion
Pour obtenir toutes les constantes déclarées dans un type donné, la réflexion peut être utilisée. Les techniques suivantes apportent une solution à ce problème :
L'approche traditionnelle consiste à récupérer les champs du type à l'aide de la méthode GetFields(). En filtrant les champs non constants en fonction de leurs propriétés IsLiteral et IsInitOnly, les champs constants peuvent être isolés. Voici un exemple d'implémentation :
private FieldInfo[] GetConstants(System.Type type) { ArrayList constants = new ArrayList(); FieldInfo[] fieldInfos = type.GetFields( // Gets all public and static fields BindingFlags.Public | BindingFlags.Static | // This tells it to get the fields from all base types as well BindingFlags.FlattenHierarchy); // Go through the list and only pick out the constants foreach(FieldInfo fi in fieldInfos) // IsLiteral determines if its value is written at // compile time and not changeable // IsInitOnly determines if the field can be set // in the body of the constructor // for C# a field which is readonly keyword would have both true // but a const field would have only IsLiteral equal to true if(fi.IsLiteral && !fi.IsInitOnly) constants.Add(fi); // Return an array of FieldInfos return (FieldInfo[])constants.ToArray(typeof(FieldInfo)); }
Pour une solution plus concise, des génériques et LINQ peuvent être utilisés :
private List<FieldInfo> GetConstants(Type type) { FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); return fieldInfos.Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList(); }
Cette méthode fournit un moyen propre et concis de filtrer les constantes.
Alternativement, une solution one-line est possible :
type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
Cette approche combine tous les filtrer les opérations en une seule expression.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!