2

これが他の場所で回答されている場合は申し訳ありませんが、私は反射にあまり慣れていないため、検索する必要がある正確な用語がわかりません.

基本的に、タイプに基づいてクラスの定義済みパブリック静的フィールドのリストを見つけようとしています。

そのため、クラス LocalisationToken を考えると、これに基づいて、AboutToken、AdminToken などの多くのクラスがあります。

これらの各クラスには、これらの派生クラスの public static readonly インスタンスがあります。次に例を示します。

public static readonly LocalisationToken TermsAndConditions = new AboutToken("Terms And Conditions", Guid.Parse("595FB313-4940-489b-9CC8-4B9BF0B62E8B"));
public static readonly LocalisationToken OkGotIt = new AboutToken("OK, got it", Guid.Parse("5F5F22A4-C45C-43f0-A2A4-304740E0EE12"));

私がやりたいことは、実行時にコンパイルされたライブラリ内のすべてのインスタンスを見つけることです。たとえば、AboutToken をインスタンス化するときの基になるコードは、コンストラクター プロパティを使用して新しい LocalisationToken を作成することです。私の要件は、Guid とデフォルトのテキストを元に戻すことです。たとえば、「利用規約」と 595FB313-4940-489b-9CC8-4B9BF0B62E8B です。

LocalisationToken を含むアセンブリで GetTypes() を使用すると、AboutToken、AdminToken などのさまざまな派生クラスを取得するだけです。代わりに実際のインスタンスが必要です。

たまたま、派生クラスはまったく必要ありません。しかし、すべてのインスタンスが「LocalisationTokens」としてマークされていても、それらを繰り返す必要がありますか?

4

1 に答える 1

8

インスタンスではなく、静的なフィールドであることを理解することが重要です。

ただし、読み取り専用の静的フィールドを簡単に見つけて、その値を取得できます。例えば:

var someAssembly = typeof(Foo).Assembly; // Or whatever
var values = from type in someAssembly.GetTypes()
             from field in type.GetFields(BindingFlags.Static |
                                          BindingFlags.Public |
                                          BindingFlags.NonPublic)
             where field.IsInitOnly &&
                   field.FieldType == typeof(LocalisationToken)
             select (LocalisationToken) field.GetValue(null);
于 2013-06-17T18:34:34.557 に答える