.NET - 获取通用接口的所有实现?

发布于 2024-11-04 13:18:56 字数 316 浏览 0 评论 0原文

关于“通过反射实现接口”的答案显示了如何获取一个接口的所有实现界面。但是,给定一个通用接口 IInterface,以下内容不起作用:

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

任何人都可以解释如何修改该方法吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静谧 2024-11-11 13:18:56

您可以使用这样的东西:

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));

}

虽然它可以抛出 TypeLoadException 但这是原始代码中已经存在的问题。例如,在 LINQPad 中它不起作用,因为某些库无法加载。

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.

标点 2024-11-11 13:18:56

它不起作用,因为 IInterface(以 T 的 System.Object 为例)不继承自“开放”泛型类型 IInterface< ;>。 “封闭”泛型类型是根类型,就像 IFoo 一样。您只能搜索封闭泛型类型,而不能搜索开放泛型类型,这意味着您可以找到从 IInterface 继承的所有内容。 IFoo 没有基类,IInterfaceIInterface 等也没有。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文