2010-10-15 59 views
1

我真的不知道这是一个C#的东西还是一个asp.net的东西。我正看着这篇文章:http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/,冲进这一行:C#和/或ASP.NET类where子句?

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class 

我是相当新的C#/ ASP.NET,所以我不完全了解这一行。 “TEntity:class”在做什么?我从来没有创建过一个带有“where子句”的类(即使它叫做什么)。

回答

3

它使用generics(C#的东西,与ASP.NET无关)。

<TEntity>是泛型类型参数,这意味着您必须指定GenericRepository的类型。

像这样:

var repo = new GenericRepository<Person>(); 

其中条款说你提供的类型必须是类。它被称为派生约束。它基本上告诉编译器执行这个约束。

如果将其更改为where TEntity : int,则上述代码将失败。

你会需要这样的:

var repo = new GenericRepository<int>(); 

了一份关于<TEntity>,这不是一个关键字/保留字。您可以轻松将其更改为<FooBar>where FooBar : class。它具有T来表示泛型,而Entity指定存储库可以在实体之外工作。

将泛型类型参数更改为对您和您的代码有意义的内容。

顺便说一句 - 那篇文章就像我目前的圣经。 :)

+1

我明白了。所以“where子句”可以用来强制提供的对象是或者是任何物品的子类。在这种情况下,它是“类”,所以任何类都可以是通用的。因此,如果我要做“:IList”,它只接受实现IList接口的类;正确? – William 2010-10-15 01:54:56

+0

@William - 完全正确。发现。我们使用泛型来避免重复。如果你没有使用类型参数 - 你需要创建一个PersonRepository,CustomerRepository等重复代码。 – RPM1984 2010-10-15 02:01:59