2009-10-21 17 views
17

Quelqu'un peut-il m'aider avec la ligne where TEntity : class, IEntity, new() dans la déclaration de classe suivante."where" mot-clé dans la déclaration de classe en c sharp

public abstract class BaseEntityManager<TEntity> 
     where TEntity : class, IEntity, new() 
+2

Et votre question est? –

+4

Je pense qu'il demande une explication de la syntaxe. – Matt

Répondre

28

where TEntity : ... applique des contraintes au paramètre générique TEntity. Dans ce cas, les contraintes sont:

classe: L'argument de TEntity doit être un type de référence
IEntity: L'argument doit être ou implémenter l'interface IEntity
nouvelle(): L'argument doit avoir un constructeur de parameterless publique

de http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

Si vous pouviez ajouter du code montrant comment quelqu'un pourrait utiliser BaseEntityManager comme une classe de base qui serait génial :) – niico

0

Où est une contrainte de type générique. Cette ligne lit que le type TEntity doit être un type de référence par opposition à un type de valeur, doit implémenter l'interface IEntity et doit avoir un constructeur qui ne prend aucun paramètre.

http://msdn.microsoft.com/en-us/library/bb384067.aspx

4

Le mot-clé where après la déclaration de classe limite quel type générique le TEntity pourrait être. Dans ce cas TEntitydoit être une classe (ce qui signifie qu'il ne peut pas être un type de valeur comme int ou DateTime), et il doit implémenter l'interface IEntity. La contrainte new() indique que les méthodes de cette classe ont la capacité d'appeler le constructeur par défaut de la classe générique représentée par TEntity (par exemple new TEntity())

-1

Quelle est la question? Laissez-moi prendre à tire sur ce que je pense que la question est. La contrainte garantit que vous pouvez seulement sous-classer BaseEntityManager avec un paramètre générique qui est un type de référence implémentant IEntity et contenant un constructeur sans paramètre.

E.X.

public class Product : IEntity { 
    public Product() {} 
} 

public class Wrong { 
    public Wrong() {} 
} 

public class WrongAgain : IEntity { 
    private Wrong() {} 
} 


// compiles 
public ProductManager : BaseEntityManager<Product> {} 


// Error - not implementing IEntity 
public WrongManager : BaseEntityManager<Wrong> {} 


/Error - no public parameterless constructor 
public WrongAgainManager : BaseEntityManager<WrongAgain> {} 

voir link text

+0

"Quelqu'un pourrait-il m'aider avec la ligne ...?" c'est la question. C'est évident ce qu'il demande. –

Questions connexes