Vous pouvez voir ce que j'essaye (mais échoue) de faire avec le code suivant:
protected T GetObject()
{
return new T();
}
Toute aide serait grandement appréciée.
ÉDITER:
Le contexte était le suivant. Je jouais avec une classe de contrôleur personnalisée pour tous les contrôleurs à dériver, avec des méthodes standardisées. Donc, en contexte, j'avais besoin de créer une nouvelle instance de l'objet du type contrôleur. Donc, au moment de la rédaction de cet article, c'était quelque chose comme:
public class GenericController<T> : Controller
{
...
protected T GetObject()
{
return (T)Activator.CreateInstance(ObjectType);
}
public ActionResult Create()
{
var obj = GetObject()
return View(obj);
}
Et j'ai donc décidé que la réflexion était la plus facile ici. Je conviens que, compte tenu de l'énoncé initial de la question, la réponse la plus appropriée pour marquer comme correcte était celle utilisant la contrainte new (). J'ai arrangé ça.
Réponses:
Jetez un œil à la nouvelle contrainte
T
pourrait être une classe qui n'a pas de constructeur par défaut: dans ce casnew T()
serait une instruction invalide. Lanew()
contrainte dit queT
doit avoir un constructeur par défaut, ce qui rendnew T()
légal.Vous pouvez appliquer la même contrainte à une méthode générique:
Si vous devez passer des paramètres:
la source
Pourquoi personne n'a suggéré
Activator.CreateInstance
?http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
la source
Une autre façon est d'utiliser la réflexion:
la source
Juste pour compléter, la meilleure solution ici est souvent d'exiger un argument de fonction d'usine:
et appelez-le quelque chose comme ceci:
Vous pouvez l'utiliser pour exiger ou utiliser les paramètres disponibles, si nécessaire.
la source
La nouvelle contrainte est correcte, mais si vous avez besoin que T soit également un type valeur, utilisez ceci:
la source
Puisqu'il est étiqueté C # 4. Avec le framework open source ImpromptuIntereface, il utilisera le dlr pour appeler le constructeur, il est significativement plus rapide que Activator lorsque votre constructeur a des arguments, et négligeable quand il ne le fait pas. Cependant, le principal avantage est qu'il gérera correctement les constructeurs avec des paramètres optionnels C # 4.0, ce qu'Activator ne fera pas.
la source
Pour obtenir cela, j'ai essayé le code suivant:
la source