我有一个包含大量泛型和IoC的应用程序。我有这样的界面:
public interface IRepository<TType, TKeyType> : IRepo
然后我对我的不同IRepository实现进行了一系列测试。许多对象都依赖于其他对象,因此为了测试,我想只抓一个有效的对象。我可以为每个方法定义一个单独的方法:
public static EmailType GetEmailType()
{
return ContainerManager.Container.Resolve<IEmailTypeRepository>().GetList().FirstOrDefault();
}
但我想制作这个通用的,所以它可以用来从它使用的存储库中获取任何对象。我定义了这个:
public static R GetItem<T, R>() where T : IRepository<R, int>
{
return ContainerManager.Container.Resolve<T>().GetList().FirstOrDefault();
}
这适用于使用整数键的实现。但我也有使用字符串的存储库。所以,我现在这样做:
public static R GetItem<T, R, W>() where T : IRepository<R, W>
这很好用。但我想将'W'限制为int或string。有没有办法做到这一点?
最短的问题是,我可以将泛型参数约束为多种类型中的一种吗?
答案 0 :(得分:3)
没有;您不能将通用参数约束为多种类型之一。实际上,通用约束是非常简单的结构。
我认为你很快就会遇到泛型约束不参与重载决策的事实。 :(
答案 1 :(得分:0)
最短的答案是:不。
更长的答案是,您可以像对待公共基类或接口一样限制。但是在int和string的情况下,int和string的公共基类是Object,这显然不是一个有趣的(如果我没记错的话,也不合法)约束。
您可以将泛型参数限制为类或结构,但同样,它不适合您的需要。
我想你只能在运行时检查类型是否合法。