通过反射实现接口

时间:2020-03-05 18:58:00  来源:igfitidea点击:

如何通过C#中的反射获取接口的所有实现?

解决方案

回答

我们是说Type实现的所有接口吗?

像这样:

ObjX foo = new ObjX();
Type tFoo = foo.GetType();
Type[] tFooInterfaces = tFoo.GetInterfaces();
foreach(Type tInterface in tFooInterfaces)
{
  // do something with it
}

希望有帮助。

回答

看看Assembly.GetTypes()方法。它返回可在程序集中找到的所有类型。我们要做的就是遍历每个返回的类型,并检查其是否实现了必要的接口。

这样做的一种方式是使用Type.IsAssignableFrom方法。

这是例子。 " myInterface"是我们要搜索其实现的接口。

Assembly myAssembly;
Type myInterface;
foreach (Type type in myAssembly.GetTypes())
{
    if (myInterface.IsAssignableFrom(type))
        Console.WriteLine(type.FullName);
}

我确实认为这不是解决问题的有效方法,但是至少,这是一个很好的起点。

回答

Assembly assembly = Assembly.GetExecutingAssembly();
List<Type> types = assembly.GetTypes();
List<Type> childTypes = new List<Type>();
foreach (Type type in Types) {
  foreach (Type interfaceType in type.GetInterfaces()) {
       if (interfaceType.Equals(typeof([yourinterfacetype)) {
            childTypes.Add(type)
            break;
       }
  }
}

也许像那样...

回答

答案是这样;它会搜索整个应用程序域-即应用程序当前加载的每个程序集。

/// <summary>
/// Returns all types in the current AppDomain implementing the interface or inheriting the type. 
/// </summary>
public static IEnumerable<Type> TypesImplementingInterface(Type desiredType)
{
    return AppDomain
           .CurrentDomain
           .GetAssemblies()
           .SelectMany(assembly => assembly.GetTypes())
           .Where(type => desiredType.IsAssignableFrom(type));
}

它的用法是这样的;

var disposableTypes =  TypesImplementingInterface(typeof(IDisposable));

我们可能还希望此函数查找实际的具体类型-即过滤掉抽象,接口和通用类型定义。

public static bool IsRealClass(Type testType)
{
    return testType.IsAbstract == false
         && testType.IsGenericTypeDefinition == false
         && testType.IsInterface == false;
}

回答

我们必须遍历所有我们感兴趣的程序集。我们可以从程序集中获取其定义的所有类型。请注意,当我们执行AppDomain.CurrentDomain.Assemblies时,只会得到已加载的程序集。直到需要时才加载装配件,这意味着我们必须在开始搜索之前显式加载装配件。