我知道有很多这样的问题,但是我找不到要解决的答案。
考虑以下抽象类:
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)
”,我将获得所有结果,包括属性的吸气剂。
可能有些琐碎,但由于我对反射不太熟悉,所以无法弄清楚自己在做错什么。
答案 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 。但是,一般技术是相同的。只需分别使用PropertyInfo
和PropertyType
而不是FieldInfo
和FieldType
。
最后,您也可以直接使用PropertyInfo
方法的重载之一来代替自己过滤GetProperties
。