リフレクションを使用した型の定数の取得
指定された型内で宣言されたすべての定数を取得するには、リフレクションを使用できます。次の手法は、この問題の解決策を提供します。
従来のアプローチでは、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(); }
このメソッドは、定数をフィルターで除外するためのクリーンで簡潔な方法を提供します。
または、1 行の解決策は次のとおりです。可能:
type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
このアプローチでは、すべてのフィルタリング操作が 1 つの式に結合されます。
以上がC# でリフレクションを使用して型のすべての定数を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。