道歉,如果这已在其他地方得到解答,但我并不过分熟悉反思,所以我不确定我应该搜索的具体条款。
基本上我正在尝试根据类型找到类的已定义公共静态字段列表。
所以给定了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”,我还需要迭代这些吗?
答案 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);