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 )); |
得到一个包含FooRepo和DifferentFooRepo类型的IEnumerable。
这与这个问题非常相似,但是使用这个例子,我想同时通过IRepository<>和User进行搜索。
- 你的问题确实是通过使用GetAllTypesImplementingOpenGenericType的公认答案来解决的,你只需要在每个if中再添加一个条件来检查特定的类型参数。
- 就这样做。然后您的任务就变成"查找实现特定接口的所有类型"。
- 我想说它甚至是这个和类似问题的副本:stackoverflow.com/q/26733/5311735
- @斯科特查姆伯伦,你能详细说明一下吗?我知道我很接近这个,但是我应该在哪里添加这些条件呢?使用你提出的解决方案,我似乎无法使它正常工作。
- 我认为这不是stackoverflow.com/q/26733/5311735的副本。虽然这个链接的问题类似,但我的问题是特定于通过实际的通用接口参数进行搜索的。在我的研究中,我确实遇到了这个问题,但这种差异对我来说并不是微不足道的,因为没有@rainman提供的答案,我无法解决我的问题。
你可以这样试试;
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(); |
- 在示例实现中,这似乎工作得很好。但有一个问题——如果我的接口和specifictypeparameter在不同的程序集中,类似的方法是否仍然有效?显然,我需要稍微更改查询,但是假设我希望能够处理该用例,那么这仍然是您推荐的方法吗?
- 是的,您可以通过稍微更改查询来处理不同的程序集。我建议您指定包含存储库的程序集。那么,这是正确的方法吗?我不知道,我不能建议正确的方法,因为我不知道需求和项目设计。但是,至少我可以建议您,如果不需要,只需为每个实体创建一个存储库。
- 当然有道理。上面的解释实际上与我的实际实现相差甚远,我只是想用简单的术语来解释它,并使其具有可传递性。在我的实际用例中,我尝试使用自定义模型创建器根据许多条件从一些输入数据创建和配置域模型,这样我的域模型中就没有任何数据逻辑。我希望能够使用反射(它们实现了IGenerator)来获取模型创建者,所以这就是我要做的方式。