【问题标题】:How get classes that implements interface, but without inheriting interfaces如何获取实现接口但不继承接口的类
【发布时间】:2019-09-05 07:10:56
【问题描述】:

假设我有接口 IA 和 IB:

public interface IA {}

public interface IB : IA {}

现在我想要直接实现 IA 的类的列表,但没有那些实现 IB 和其他从 IA 继承的接口的类。

如果我有 Foo 和 Bar 类:

public class Foo : IA {}

public class Bar : IB {}

我希望我的代码只返回 Foo 类。我想我可以通过反思来做到这一点。我有方法返回所有实现 IA 的类的列表,但现在我不知道下一步该做什么。

var types = Assembly.Load("abc").GetTypes();
return types.Where(i => typeof(IA).IsAssignableFrom(i) && i.IsClass);

【问题讨论】:

  • 首先获取继承自IA的接口列表。然后使用您当前的代码。现在从第一个列表中排除任何可以分配给 Any 的内容。
  • i.GetInterfaces() 告诉你i 实现了哪些接口,所以你可以检查一下。
  • 我将尝试使用 GetInterfaces。我会告诉你它是否有效。

标签: c# reflection


【解决方案1】:

您可以制作一个扩展方法来确定这一点:

public static class TypeExtensions
{
    public static bool DirectlyImplements(this Type testType, Type interfaceType)
    {
        if (!interfaceType.IsInterface || !testType.IsClass || !interfaceType.IsAssignableFrom(testType)) { return false; }
        return !testType.GetInterfaces().Any(i => i != interfaceType && interfaceType.IsAssignableFrom(i));
    }
}

基本上,它会检查类型是否实现了接口,但也会检查该类实现的其他接口是否可分配给它。因此它只会返回直接实现接口的类。

你可以这样使用它:

var list = types.Where(t => t.DirectlyImplements(typeof(IA))).ToList();

【讨论】:

  • 看起来不错,我试试看!
猜你喜欢
  • 2023-03-13
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2018-05-28
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多