使用反射檢索類型的常數
要取得給定類型中聲明的所有常數,可以使用反射。以下技術提供了此問題的解決方案:
傳統方法涉及使用 GetFields() 方法檢索該類型的欄位。透過根據 IsLiteral 和 IsInitOnly 屬性過濾掉非常量字段,可以隔離常數字段。以下是一個範例實作:
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)); }
為了更簡潔的解決方案,可以利用泛型和LINQ:
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(); }
此方法提供了一種乾淨簡潔的方法來過濾常量。
或者,也可以使用單行解:
type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
這方法將所有過濾操作合併到一個表達式中。
以上是如何在 C# 中使用反射檢索某個類型的所有常數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!