如何通过反射从基类型获取静态属性

How to get static properties from base type via reflection

我尝试通过反射从基类型获取静态属性。这边有很多关于这个主题的问题,但它们都集中在获取基类型的非静态属性或从目标类型获取静态属性。

public class A
{
    public static string STATIC_BaseProp => "STATIC_BaseProp"; //<-- I want this
    public string BaseProp => "BaseProp";
}

public class B : A
{
    public static string STATIC_Prop => "STATIC_Prop";
    public string Prop => "PROP";
}

static void Main(string[] args)
{
    var type = typeof(B);
    foreach (var propertyInfo in type.GetProperties())
    {
        Console.log(propertyInfo);
    }
}

输出:

System.String STATIC_Prop
System.String Prop
System.String BaseProp

这似乎只解决了目标类型的静态属性以及目标类型和基类型的非静态属性。但我只想要基本类型 (STATIC_BaseProp)

的静态 属性

有人知道怎么做吗?

要仅获取基类型的静态属性,我建议访问 Type.BaseType property (like described in this answer) and use only Public | Static Bindingflags:

static void Main(string[] args)
{
    var type = typeof(B);
    foreach (var propertyInfo in type.BaseType.GetProperties( BindingFlags.Public | BindingFlags.Static ))
    {
        Console.WriteLine(propertyInfo);
    }

    Console.ReadKey();
}

免责声明:这仅适用于继承层次结构的一个级别。如果您想要更深入的了解,则需要深入了解基本类型。

输出:

System.String STATIC_BaseProp

如果您想要整个继承层次结构中的所有静态属性,您可以使用 BindingFalgs 的这种组合:

type.GetProperties( BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)

这里有一个例子来证明如果你在 A

之上添加一个父 class 它也可以工作
public class ParentOfA
{
    public static string STATIC_ParentBaseProp => "STATIC_ParentBaseProp"; //<-- I want this
    public string ParentBaseProp => "BaseProp";
}

public class A : ParentOfA
{
    public static string STATIC_BaseProp => "STATIC_BaseProp"; //<-- I want this
    public string BaseProp => "BaseProp";
}

public class B : A
{
    public static string STATIC_Prop => "STATIC_Prop";
    public string Prop => "PROP";
}

static void Main(string[] args)
{
    var type = typeof(B);
    foreach (var propertyInfo in type.GetProperties( 
                                      BindingFlags.Public |
                                      BindingFlags.Static |
                                      BindingFlags.FlattenHierarchy))
    {
        Console.WriteLine(propertyInfo);
    }


    Console.ReadKey();
}

输出:

System.String STATIC_Prop
System.String STATIC_BaseProp
System.String STATIC_ParentBaseProp