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
Susan Sarandonoriginal
2025-01-03 19:38:41359parcourir

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));
}

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();
}

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();

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!

Déclaration:
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