Heim > Backend-Entwicklung > C++ > Wie kann ich mithilfe von Reflection in C# alle Konstanten eines Typs abrufen?

Wie kann ich mithilfe von Reflection in C# alle Konstanten eines Typs abrufen?

Susan Sarandon
Freigeben: 2025-01-03 19:38:41
Original
358 Leute haben es durchsucht

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

Konstanten eines Typs mithilfe von Reflektion abrufen

Um alle innerhalb eines bestimmten Typs deklarierten Konstanten zu erhalten, kann Reflektion eingesetzt werden. Die folgenden Techniken bieten eine Lösung für dieses Problem:

Der traditionelle Ansatz besteht darin, die Felder des Typs mithilfe der GetFields()-Methode abzurufen. Durch das Herausfiltern nicht konstanter Felder basierend auf ihren Eigenschaften „IsLiteral“ und „IsInitOnly“ können die konstanten Felder isoliert werden. Hier ist eine Beispielimplementierung:

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));
}
Nach dem Login kopieren

Für eine präzisere Lösung können Generics und LINQ verwendet werden:

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();
}
Nach dem Login kopieren

Diese Methode bietet eine saubere und präzise Möglichkeit, Konstanten herauszufiltern.

Alternativ ist auch eine einzeilige Lösung möglich:

type.GetFields(BindingFlags.Public | BindingFlags.Static |
               BindingFlags.FlattenHierarchy)
    .Where(fi => fi.IsLiteral &amp;&amp; !fi.IsInitOnly).ToList();
Nach dem Login kopieren

Dieser Ansatz vereint alle Filtervorgänge in einem einzigen Ausdruck.

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection in C# alle Konstanten eines Typs abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage