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",我还需要迭代这些吗?
重要的是要理解它是静态的领域 - 而不是实例.
您可以轻松找到只读静态字段,并获取它们的值.例如:
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)