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!