Injecter des paramètres dans des instances de constructeur générique
Dans le cadre d'une méthode générique qui nécessite de créer une instance d'un type spécifique, la question se pose : comment pouvons-nous gérer les situations où le constructeur de ce type nécessite un paramètre ? Prenons un cas où BaseFruit possède un constructeur qui accepte un poids entier. Peut-on instancier un fruit au sein d'une méthode générique de la manière suivante :
public void AddFruit<T>() where T: BaseFruit { BaseFruit fruit = new T(weight); // new Apple(150) fruit.Enlist(fruitManager); }
Dans l'exemple fourni, on peut observer une tentative d'instancier une instance Apple avec un poids de 150. Cependant, cette approche n'est pas réalisable à moins que BaseFruit soit équipé d'un constructeur sans paramètre, permettant l'affectation ultérieure de variables membres. Malheureusement, dans des scénarios pratiques, cette approche peut s'avérer peu pratique.
Pour résoudre ce problème, nous pouvons exploiter la classe Activator, comme le montre l'exemple simplifié suivant :
return (T)Activator.CreateInstance(typeof(T), new object[] { weight });
Notez qu'en employant la contrainte new() sur T sert uniquement à garantir que le compilateur vérifie l'existence d'un constructeur public sans paramètre lors de la compilation. La classe Activator est en fin de compte responsable du processus de création de type.
Il est crucial de vérifier l'existence du constructeur spécifique que vous avez l'intention d'utiliser. En outre, il convient de se demander si une telle exigence est nécessaire, car elle peut indiquer un problème de conception de code qui pourrait être évité dans les implémentations C# actuelles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!