获取类的所有静态属性

RBA*_*RBA 3 .net c# reflection

我知道有很多这样的问题,但我找不到我想做的事情的任何答案。

考虑以下抽象类:

public abstract class TestBase
{
    public static ITest Test => Container.Resolve<ITest>();
    public static ITest1 Test1 => Container.Resolve<ITest1>();
    public static ITest2 Test2 => Container.Resolve<ITest2>();
    public static ITest3 Test3 => Container.Resolve<ITest3>();
}
Run Code Online (Sandbox Code Playgroud)

我试图获取从 IDummy 接口继承的所有属性,如下所示:

    var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
        .Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true);
Run Code Online (Sandbox Code Playgroud)

但列表是空的。如果不添加 where 子句“ .Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true)”,我会得到所有结果,包括属性的 getter。

可能是一些微不足道的事情,但由于我对反射不太熟悉,我无法弄清楚我做错了什么。

O. *_*per 7

您从中返回的GetMembersMemberInfo实例(或者,对于字段,FieldInfo实例)。因此,您无法直接检查这些对象是否可从 分配IDummy

您真正想要做的是过滤MemberInfo对象的字段,然后检查FieldType每个对象的属性:

var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
    .OfType<FieldInfo>()
    .Where(f => typeof(IDummy).IsAssignableFrom(f.FieldType));
Run Code Online (Sandbox Code Playgroud)

另请注意,我颠倒了通话的主题和对象IsAssignableFrom,正如帕特里克的评论中所建议的那样。


正如我刚刚注意到的,您的示例似乎显示了properties而不是fields。不过,一般技术是相同的;只需分别使用PropertyInfoPropertyType而不是FieldInfoFieldType

PropertyInfo最后,您还可以直接使用该方法的重载之一,而不是自己进行过滤GetProperties