获取实现接口的所有类型我们可以很容易地获取程序集中实现特定接口的所有类型。
的例子:
interface IFace
{
}
class Face : IFace
{
}
class TwoFace : Face
{
}
对于这个结构,我们将通过反射找到两个类,也就是说,所有从第一个实现派生的类,使用
GetTypes().Where(
type => type.GetInterfaces().Contains(typeof(IFace))
)
因此,问题是:我如何将结果限制为最初实现接口的基类?!在这个例子中:只有类类型Face是相关的
首先,我将使用Type.IsAssignableFrom
而不是GetInterfaces
,但随后您需要做的就是排除父类型已经在集合中的类型:
var allClasses = types.Where(type => typeof(IFace).IsAssignableFrom(type))
.ToList(); // Or use a HashSet, for better Contains perf.
var firstImplementations = allClasses
.Except(allClasses.Where(t => allClasses.Contains(t.BaseType)));
或者如注释中所述:
var firstImplementations = allClasses.Where(t => !allClasses.Contains(t.BaseType));
注意,这将不是返回从实现接口的类派生的类,而是重新实现它。