使用反射来获取派生类的静态实例的实例

时间:2013-06-17 18:31:30

标签: c# asp.net system.reflection

道歉,如果这已在其他地方得到解答,但我并不过分熟悉反思,所以我不确定我应该搜索的具体条款。

基本上我正在尝试根据类型找到类的已定义公共静态字段列表。

所以给定了LocalisationToken类我有很多基于此类的类,例如AboutToken,AdminToken等。

每个类都有这些派生类的公共静态只读实例,例如:

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”,我还需要迭代这些吗?

1 个答案:

答案 0 :(得分:7)

重要的是要理解字段是静态的 - 而不是实例

您可以轻松找到只读静态字段,并获取其值。例如:

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);