从类中获取所有静态属性

时间:2019-03-22 08:46:05

标签: c# .net 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>();
}

我试图像这样从接口IDummy继承所有的属性:

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

,但列表为空。不添加where子句“ .Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true)”,我将获得所有结果,包括属性的吸气剂。

可能有些琐碎,但由于我对反射不太熟悉,所以无法弄清楚自己在做错什么。

1 个答案:

答案 0 :(得分:3)

GetMembers返回的内容是MemberInfo实例(或者对于字段,FieldInfo实例)。因此,您不能直接检查这些对象是否可从IDummy分配。

您实际要做的是为字段过滤MemberInfo对象,然后检查以下每个对象的FieldType属性:

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

另外,请注意,正如Patrick's comment中所建议的那样,我转过了IsAssignableFrom调用的主题和宾语。


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

最后,您也可以直接使用PropertyInfo方法的重载之一来代替自己过滤GetProperties