关于c#:通过搜索特定的通用接口参数获取实现通用接口的类型

Get type that implements generic interface by searching for a specific generic interface parameter

本问题已经有最佳答案,请猛点这里访问。

我想创建一个方法,该方法返回一个类型(或类型的IEnumerable),该类型实现一个接受类型参数的特定接口——但是我想通过该泛型类型参数本身进行搜索。这很容易作为一个例子来演示:

我想要的方法签名:

1
 public IEnumerable<Type> GetByInterfaceAndGeneric(Type interfaceWithParam, Type specificTypeParameter)

如果我有下面的物体

1
2
3
  public interface IRepository<T> { };
  public class FooRepo : IRepository<Foo> { };
  public class DifferentFooRepo : IRepository<Foo> {};

然后我想能够做到:

1
  var repos = GetByInterfaceAndGeneric(typeof(IRepository<>), typeof(Foo));

得到一个包含FooRepoDifferentFooRepo类型的IEnumerable。

这与这个问题非常相似,但是使用这个例子,我想同时通过IRepository<>User进行搜索。


你可以这样试试;

1
2
3
4
5
6
7
8
9
10
11
    public static IEnumerable<Type> GetByInterfaceAndGeneric(Type interfaceWithParam, Type specificTypeParameter)
    {
        var query =  
            from x in specificTypeParameter.Assembly.GetTypes()
            where
            x.GetInterfaces().Any(k => k.Name == interfaceWithParam.Name &&
            k.Namespace == interfaceWithParam.Namespace &&
            k.GenericTypeArguments.Contains(specificTypeParameter))
            select x;
        return query;
    }

使用情况;

1
var types = GetByInterfaceAndGeneric(typeof(IRepository<>), typeof(Foo)).ToList();