myInterface.GetGenericTypeDefinition()不等于myType,但myInterface

本文关键字:myInterface myType GetGenericTypeDefinition 不等于 | 更新日期: 2023-09-27 18:29:55

我正在寻找IHandle<>的所有实现在我的集会上。

public interface IHandle<T> where T : class, IEvent, new()

这些类看起来像

public class IHandleEventX : IHandle<EventX>{...}
public class IHandleAnotherEvent : IHandle<AnotherEvent>{...}

目前,我得到了以下代码。

aLoader.LoadImplementationOf(typeof(IHandle<>));
// my aLoader class method
public void LoadImplementationOf(Type genericInterface)
{
    // theres another foreach here, to iterate over all assemblies
    foreach (Type aType in allMyAssemblies.GetTypes())
    {
        var interfaces = aType.GetInterfaces();
        foreach (var currentInterface in interfaces)
        {
            if (!currentInterface.IsGenericType) { continue; }
            // the statement below always return false
            if (currentInterface.GetGenericTypeDefinition() == genericInterface)
            {}
            // those two statement (FullName and AssemblyQualifiedName), works as expected
            if (currentInterface.GetGenericTypeDefinition().FullName == genericInterface.FullName)
            {}
            if (currentInterface.GetGenericTypeDefinition().AssemblyQualifiedName == genericInterface.AssemblyQualifiedName)
            {}
            // those below also fail
            if (currentInterface.GetGenericTypeDefinition().IsAssignableFrom(genericInterface))
            {}
            if (genericInterface.IsAssignableFrom(currentInterface.GetGenericTypeDefinition()))
            {}
            // can't do currentInterface.GetGenericTypeDefinition() is genericInterface compiler error
        }
    }

为什么比较类型失败,但比较类型fullname属性有效?还有,最好的方法是什么?

编辑:我重写了样本,只使用了一个程序集,IsAssignableFrom起作用。稍后我将在这里进行调查和更新,看看为什么使用多个程序集不起作用——正如@HansPassant所指出的


它现在起作用了,但我不知道为什么。。。我正在处理3个程序集。

  • Asm Loader,那里只有de ALoader类
  • Asm域,具有接口IHandle<>,IE事件<>和类IHandleEventX、IHandleAnotherEvent
  • 在我的测试项目Asm Test中,我调用了aLoader.LoadImplementationOf(typeof(IHandle<>));从这里

项目参考资料。

  • Loader不引用任何项目
  • 域引用Loader(Loader上有另一个IInterface,在域上实现)
  • 测试同时引用Loader和Domain

所以我移动了我的接口IHandle<>以及IEvent<>从域到加载器,并删除了从域到Loader的引用,现在,它开始工作了。

目前尚不清楚当IHandle<>时IsAssignableFrom失败的原因在域中。只有当我的IHandle<>和ALoader在同一组件中。


最后,这是我的错,我在两个加载上下文中加载了反汇编。

myInterface.GetGenericTypeDefinition()不等于myType,但myInterface

考虑到Type是一种引用类型,我认为这是关于引用比较。

用途:

类型.Is可从分配

祝你好运。

这是因为Type.FullName没有完全描述类型。您只能获得命名空间名称和类型名称。但是,.NET还包括程序集的属性,其中类型驻留在类型标识中。显示名称、[AssemblyVersion]、区域性、PublicKeyToken和(间接)ProcessorArchitecture。您要比较Type.AssemblyQualifiedName

对这种故障的诊断是,包含接口定义的源代码被编译成多个程序集。这本身几乎总是一个错误,您需要确保这样的接口类型只存在于一个程序集中。任何使用接口类型的程序集都有对接口类型的引用,因此它们都使用相同的类型。

在.NET 4中,类型标识的规则有所放宽,如果一个类型具有相同的GUID,则它可以是相同的。嵌入互操作类型功能的底层核心。但这只适用于[ComImport]类型,我怀疑这里的情况是否如此。