【问题标题】:Optimize finding all classes implementing IInterface<T> and those explicitly implementing it with a specific type优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类
【发布时间】:2009-08-11 18:11:42
【问题描述】:

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

我想要实现的是获取通用实现和实现特定类型的列表。你可以让 T=int 在下面的代码中。

要让所有实现某种类型的 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();
}

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

【问题讨论】:

    标签: c# .net linq interface assemblies


    【解决方案1】:

    不幸的是,我不知道任何其他方式(我也不得不多次编写此类代码)。

    您可以做的一件事是使第一种方法中的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();
    }
    

    【讨论】:

    • 在第一个循环中检查 .Name 属性是最困扰我的,因为它不是 100%。如果有人创建另一个具有相同名称的接口,它可以匹配。我想我可以添加一些逻辑来检查 FullName。
    • 为我的答案添加了更好的版本。
    • +1 用于在标题中使用 linq 答案回答带有“优化”一词的问题。
    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2012-04-16
    • 2016-05-13
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多