282 votes

Créer l’instance du type générique ?

Si BaseFruit a un constructeur qui accepte un int poids, je peux instancier un morceau de fruit dans une méthode générique de ce genre?

public void AddFruit<T>()where T: BaseFruit{
    BaseFruit fruit = new T(weight); /*new Apple(150);*/
    fruit.Enlist(fruitManager);
}

Un exemple est ajouté derrière les commentaires. Il semble que je ne peut le faire que si je donne BaseFruit un parless constructeur et ensuite remplir tout à travers des variables membres. Dans mon vrai code (pas sur les fruits), c'est plutôt pratique.

-Mise à jour-
Il semble donc qu'il ne peut pas être résolu par des contraintes de toute façon-là. À partir des réponses il y a trois solutions:

  • Modèle De Fabrique
  • La réflexion
  • Activateur

Je pense que la réflexion est la moins propre, mais je ne peux pas décider entre les deux autres.

421voto

meandmycode Points 9475

En outre, un exemple plus simple :

Notez qu’en utilisant la contrainte new() sur T est seulement pour faire le compilateur à vérifier pour un constructeur sans paramètre public au moment de la compilation, le code utilisé pour créer le type est la classe Activator.

Vous devrez vous assurer vous-même concernant le constructeur spécifique existant et ce genre d’exigence peut être une odeur de code (ou plutôt quelque chose que tu devrais juste éviter dans la version actuelle sur c#).

109voto

Jon Skeet Points 692016

Vous ne pouvez pas utiliser de paramétrer constructeur. Vous pouvez utiliser un constructeur sans paramètre si vous avez un "T : new()" de la contrainte.

C'est une douleur, mais telle est la vie :(

C'est l'une des choses que j'aimerais aborder avec l' interface"statique". Vous seriez alors en mesure de contraindre T pour inclure des méthodes statiques, les opérateurs et les constructeurs, puis de les appeler.

73voto

Adam Robinson Points 88472

Oui ; changer votre où à être :

Toutefois, ceci ne fonctionne qu’avec sans paramètre constructeurs. Vous devrez avoir un autre moyen de définir votre propriété (définissant la propriété elle-même ou par quelque chose de similaire).

20voto

JaredPar Points 333733

Comme Jon a souligné c’est la vie pour contraindre un constructeur sans paramètre-non. Cependant une autre solution consiste à utiliser un modèle de fabrique. Il s’agit d’assujettir facilement

Encore une autre option consiste à utiliser une approche fonctionnelle. Passer à une méthode de fabrique.

10voto

Rüdiger Stevens Points 5381

Vous pouvez effectuer à l’aide de la réflexion :

EDIT : Constructeur ajouté == contrôle null.

EDIT : Une variante plus rapide en utilisant un cache :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X