代码之家  ›  专栏  ›  技术社区  ›  Mikael Svenson

优化查找实现iInterface<t>的所有类,以及那些使用特定类型显式实现它的类

  •  2
  • Mikael Svenson  · 技术社区  · 15 年前

    我定义了一个接口ISerializedDeserialize,一些类继承了通用接口。我还有一些使用codedomProvider生成的代码生成的程序集,它生成从同一接口继承的类,但使用特定类型实现它。

    我想要实现的是获得一个通用实现和实现特定类型的实现的列表。您可以在下面的代码中让t=in t。

    要获取实现某种类型的ISerializeDeserialize的所有类,目前我有以下代码:

    private List<Type> GetListOfGenericSerializers()
    {
        Type interfaceGenricType = typeof(ISerializeDeserialize<T>);
    
        var serializers = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                          from genericType in assembly.GetTypes()
                          from interfaceType in genericType.GetInterfaces()
                              .Where(iType => (iType.Name == interfaceGenricType.Name && genericType.IsGenericTypeDefinition))
                          select genericType;
    
        return serializers.ToList();
    }
    
    private List<Type> GetListOfTypeImplementedSerializers()
    {
        Type interfaceGenricType = typeof(ISerializeDeserialize<T>);
    
        var serializers = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                          from implementedType in assembly.GetTypes()
                          from interfaceType in implementedType.GetInterfaces()
                              .Where(iType => iType == interfaceGenricType)
                          select implementedType;
    
        return serializers.ToList();
    }
    

    我可以把它们放在一个函数中,但为了清晰起见,我使用了两个函数。问题是,这是可以优化的还是以更好的方式完成的?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Thomas Danecker    15 年前

    不幸的是,我没有意识到任何其他的方法(我还不得不多次编写这样的代码)。

    你能做的一件事就是 Where 在第一种方法中,更好一点:

    private List<Type> GetListOfGenericSerializers()
    {
      Type interfaceGenricType = typeof(ISerializeDeserialize<>);
    
      var serializers =
        from assembly in AppDomain.CurrentDomain.GetAssemblies()
        from genericType in assembly.GetTypes()
        from interfaceType in genericType.GetInterfaces()
        where genericType.IsGenericTypeDefinition &&
              interfaceType.IsGeneric &&
              interfaceType.GetGenericTypeDefinition() == interfaceGenericType
        select genericType;
    
      return serializers.ToList();
    }