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.
精彩评论