C#多重约束

时间:2010-05-20 14:44:32

标签: c# generics

我有一个包含大量泛型和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。有没有办法做到这一点?

最短的问题是,我可以将泛型参数约束为多种类型中的一种吗?

2 个答案:

答案 0 :(得分:3)

没有;您不能将通用参数约束为多种类型之一。实际上,通用约束是非常简单的结构。

我认为你很快就会遇到泛型约束不参与重载决策的事实。 :(

答案 1 :(得分:0)

最短的答案是:不。

更长的答案是,您可以像对待公共基类或接口一样限制。但是在int和string的情况下,int和string的公共基类是Object,这显然不是一个有趣的(如果我没记错的话,也不合法)约束。

您可以将泛型参数限制为类或结构,但同样,它不适合您的需要。

我想你只能在运行时检查类型是否合法。