在接口声明中使用where

时间:2011-04-07 08:32:41

标签: c# generics repository

我有以下域对象:

public class Bank : IEntity
{
}

以下IRepository:

public interface IRepository<TEntity> where TEntity : IEntity
{
}

需要where TEntity : IEntity吗?这是什么意思,TEntity属于IEntity类型?当我使用像TEntity这样的东西时,是否有任何命名约定? T代表什么?

4 个答案:

答案 0 :(得分:2)

您的IRepository是通用类,TEntity是泛型类型参数。它就像实际类型的占位符。

TEntity: IEntity表示您将要求使用的实际类型实现IEntity,并且在您的实际存储库实现中,您可以引用接口IEntity公开的方法和属性。

是否需要它取决于存储库的预期用途。通常,类型限制用于强制执行泛型实现所依赖的类型的某些属性。

答案 1 :(得分:2)

您可以在Why use generic constraints?中阅读有关通用约束及其用法的信息,您可能需要查看MSDN docs以获取更多官方报道。

对于'T',这是一个严格的约定,当这些东西被称为'templates'时,可以追溯到C ++。 (不过,这是一个你应遵循的惯例。)

答案 2 :(得分:1)

where TEntity : IEntity表示TEntity类型必须实现IEntity接口。换句话说,在通用接口IRepository中,您可以使用实现IEntity接口的类型。

答案 3 :(得分:1)

这取决于您的设计时间需求。

您可以使用TEntity替换通用IEntity用途。但是,您将仅限于IEntity的成员。

您必须转发IEntity成员才能访问其子类型成员。