.NET - Getting all implementations of a generic interface?

后端 未结 2 755
余生分开走
余生分开走 2020-12-07 00:16

An answer on \" Implementations of interface through Reflection \" shows how to get all implementations of an interface. However, given a generic interface, IInterface

相关标签:
2条回答
  • 2020-12-07 01:04

    It doesn't work because IInterface<object> (using System.Object for T as an example) doesn't inherit from the "open" generic type IInterface<>. A "closed" generic type is a root type, just like IFoo. You can only search for closed generic types, not open ones, meaning you could find everything that inherits from IInterface<int>. IFoo does not have a base class, nor does IInterface<object> or IInterface<string> etc.

    0 讨论(0)
  • 2020-12-07 01:07

    You can use something like this:

    public static bool DoesTypeSupportInterface(Type type, Type inter)
    {
        if(inter.IsAssignableFrom(type))
            return true;
        if(type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == inter))
            return true;
        return false;
    }
    
    public static IEnumerable<Type> TypesImplementingInterface(Type desiredType)
    {
        return AppDomain
            .CurrentDomain
            .GetAssemblies()
            .SelectMany(assembly => assembly.GetTypes())
            .Where(type => DoesTypeSupportInterface(type, desiredType));
    
    }
    

    It can throw a TypeLoadException though but that's a problem already present in the original code. For example in LINQPad it doesn't work because some libraries can't be loaded.

    0 讨论(0)
提交回复
热议问题