c# - 优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类

标签 c# .net linq interface assemblies

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

我想要实现的是获取通用实现和实现特定类型的列表。您可以在下面的代码中让 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();
}

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

最佳答案

不幸的是,我不知道有任何其他方法(我也不得不多次编写这样的代码)。

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

关于c# - 优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262057/

相关文章:

c# - VSTO 字 2016 : Squiggly underline without affecting undo

c# - 如何检查一个字符串是否不等于所有这些?

c# - 使用 LINQ 避免 ObjectDisposedException (LINQ2SQL)

c# - 重新抛出 AggregateException 的内部异常

用于遗传编程的 C# 动态树

c# - 从代码文件动态设置控件的属性

c# - 部署后连接字符串修改

.net - 有没有办法将属性放在匿名类型属性上?

c++ - 在 Windows 7 中释放写入权限

c# - 非重复计数 x 和按日期 y 分组