考虑以下接口
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)
最佳答案
您可以结合使用Reflection
和Linq
来执行以下操作:
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()...))