Supposons que vous disposiez d'une méthode générique qui accepte un type générique et que vous souhaitiez instancier une instance de ce type avec des paramètres de constructeur spécifiques. Cependant, le constructeur du type nécessite un paramètre et vous ne savez pas si vous pouvez le faire.
L'extrait de code suivant illustre une tentative de création d'un objet fruit dans une méthode générique :
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); /*new Apple(150);*/ fruit.Enlist(fruitManager); }</code>
Cette approche peut échouer car BaseFruit
n'a pas de constructeur sans paramètre. Il faut un paramètre entier pour préciser le poids du fruit.
Pour résoudre ce problème, C# fournit la classe Activator
. Vous pouvez créer une instance d'un type en utilisant la méthode Activator.CreateInstance
et passer un tableau d'objets comme argument constructeur :
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>
Notez que l'utilisation de la contrainte T
sur new()
garantit uniquement que le compilateur vérifie les constructeurs publics sans paramètre au moment de la compilation. Le code réel utilisé pour créer le type est géré par la classe Activator
.
Bien que cette approche vous permette d'instancier un type avec un constructeur paramétré, vous devez vous assurer que le constructeur spécifique est présent dans la définition du type. S'appuyer sur cette approche peut indiquer des odeurs de code potentielles et suggérer que vous devriez explorer d'autres options de conception.
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!