Maison > développement back-end > C++ > Comment puis-je récupérer toutes les constantes d'un type à l'aide de Reflection en C# ?

Comment puis-je récupérer toutes les constantes d'un type à l'aide de Reflection en C# ?

Susan Sarandon
Libérer: 2025-01-03 19:38:41
original
322 Les gens l'ont consulté

How Can I Retrieve All Constants of a Type Using Reflection in C#?

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));
}
Copier après la connexion

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 &amp;&amp; !fi.IsInitOnly).ToList();
}
Copier après la connexion

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 &amp;&amp; !fi.IsInitOnly).ToList();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal