考虑以下接口

public interface ISample
public interface ISample2 : ISample

public class A
{
    [Field]
    ISample SomeField {get; set;}

    [Field]
    ISample2 SomeOtherField {get; set; }
}


假设有各种类(例如A类)和各种字段(例如SomeField和SomeOtherField)。
如何获得所有此类字段的列表,这些字段的类型为ISample或从ISample派生的其他接口(例如ISample2)

最佳答案

您可以结合使用ReflectionLinq来执行以下操作:

var obj = new A();
var properties = obj.GetType().GetProperties()
                    .Where(pi => typeof(ISample).IsAssignableFrom(pi.PropertyType))


在处理泛型时,您必须格外谨慎。但是对于您的要求,这应该很好

如果要获取具有至少一个属性的所有类,并返回ISample的子类,则必须使用程序集,例如,当前正在执行

Assembly.GetExecutingAssembly().GetTypes()
        .SelectMany(t => t.GetProperties().Where(pi => // same code as the sample above)


如果您有多个要探测的组件,则可以使用类似这样的东西

IEnumerable<Assembly> assemblies = ....
var properties = assemblies
            .SelectMany(a => a.GetTypes().SelectMany(t => t.GetProperties()...))

10-07 13:55