开发者

.NET - Getting all implementations of a generic interface?

开发者 https://www.devze.com 2023-03-01 17:13 出处:网络
An answer on \" Implementations of interface through Reflection \" shows how to get all implementations of an interface. 开发者_开发技巧However, given a generic interface, IInterface<T>, the fol

An answer on " Implementations of interface through Reflection " shows how to get all implementations of an interface. 开发者_开发技巧However, given a generic interface, IInterface<T>, the following doesn't work:

var types = TypesImplementingInterface(typeof(IInterface<>))

Can anyone explain how I can modify that method?


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.


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

精彩评论

暂无评论...
验证码 换一张
取 消