2

抱歉,如果这已在其他地方得到回答,但我对反射并不太熟悉,所以我不确定我应该搜索的确切术语。

基本上,我正在尝试为基于类型的类查找已定义的公共静态字段列表。

因此,鉴于类 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”,我是否需要遍历这些?

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 回答