Heim >Backend-Entwicklung >C++ >Wie kann ich mithilfe von Reflection in C# alle Konstanten eines Typs abrufen?
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)); }
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 && !fi.IsInitOnly).ToList(); }
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 && !fi.IsInitOnly).ToList();
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!