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

C# 使用反射获取派生类的静态实例的实例,c#,asp.net,system.reflection,C#,Asp.net,System.reflection,如果其他地方已经回答了,我会道歉,但我对反射不太熟悉,所以我不确定我应该搜索的确切术语 基本上,我试图为基于类型的类找到已定义的公共静态字段列表 因此,给定LocalizationToken类,我有许多基于它的类,例如AboutToken、AdminToken等 每个类都有这些派生类的公共静态只读实例,例如: public static readonly LocalisationToken TermsAndConditions = new AboutToken("Terms And Condit

如果其他地方已经回答了,我会道歉,但我对反射不太熟悉,所以我不确定我应该搜索的确切术语

基本上,我试图为基于类型的类找到已定义的公共静态字段列表

因此,给定LocalizationToken类,我有许多基于它的类,例如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”,我是否需要迭代这些实例呢?

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

不过,您可以很容易地找到只读静态字段,并获取它们的值。例如:

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

field.FieldType==typeof(LocalizationToken)
总是为我返回false。在调试过程中,我可以看到FieldType看起来是相同的,但Equals方法总是false。不确定这里的最佳实践;我的特定应用程序只是一个开发工具,因此我可能会在
field.FieldType.FullName
@Ricket:上进行匹配,这意味着您可能在不同的程序集中(或不同加载的程序集中)有两个
LocalizationToken
类。仅仅根据这些信息很难判断——你可能想问一个更详细的新问题。