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

Ste*_*wen 1 c# asp.net system.reflection

如果这已在其他地方得到解答,请道歉,但我并不过分熟悉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"));
Run Code Online (Sandbox Code Playgroud)

我想要做的是在运行时在编译库中查找所有实例.例如,实例化AboutToken时的底层代码是使用构造函数属性创建新的LocalisationToken.我的要求是恢复Guid和默认文本,例如"条款和条件"和595FB313-4940-489b-9CC8-4B9BF0B62E8B

如果我在包含LocalisationToken的程序集上使用GetTypes(),我只需要获取各种派生类的AboutToken,AdminToken等.我需要实际的实例.

碰巧的是,我根本不需要派生类.但是,即使所有实例都标记为"LocalisationTokens",我还需要迭代这些吗?

Jon*_*eet 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);
Run Code Online (Sandbox Code Playgroud)