获取所有首先实现接口但没有派生类的c#类型

chi*_*.de 12 c# reflection

获取实现接口的所有类型相关,我们可以轻松地获得实现特定接口的Assembly中的所有类型.

例:

interface IFace
{
}

class Face : IFace
{
}

class TwoFace : Face
{
}
Run Code Online (Sandbox Code Playgroud)

对于这个结构,我们将通过反射找到这两个类,即使用第一个实现派生的所有类

GetTypes().Where(
  type => type.GetInterfaces().Contains(typeof(IFace))
)
Run Code Online (Sandbox Code Playgroud)

所以问题是:如何将结果限制为最初实现接口的基类?! 在此示例中:只有类类型Face是相关的.

Jon*_*eet 15

首先,我使用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)));
Run Code Online (Sandbox Code Playgroud)

或者如评论中所述,等效地:

var firstImplementations = allClasses.Where(t => !allClasses.Contains(t.BaseType));
Run Code Online (Sandbox Code Playgroud)

请注意,这不会返回从实现接口的类派生的类,但会重新实现它.