Passer des arguments de constructeur à des types génériques en C#
La création d'instances de types génériques avec des constructeurs paramétrés en C# peut présenter des défis. Toute tentative d'instanciation directe entraîne souvent l'erreur : « impossible de fournir des arguments lors de la création d'une instance d'une variable ». En effet, le compilateur ne connaît pas la signature spécifique du constructeur au moment de la compilation.
La contrainte new()
autorise uniquement les constructeurs sans paramètre. Pour gérer les constructeurs avec des arguments, une solution courante consiste à utiliser une méthode de fabrique (souvent représentée par un délégué).
Voici comment y parvenir :
Au lieu d'instancier directement le type générique, transmettez un délégué (par exemple, un Func
) à votre méthode générique. Ce délégué agira comme une usine, chargée de créer l'objet avec les arguments constructeur nécessaires.
Exemple :
<code class="language-csharp">public static string GetAllItems<T>(..., Func<ListItem, T> factoryMethod) { // ... List<T> tabListItems = new List<T>(); foreach (ListItem listItem in listCollection) { tabListItems.Add(factoryMethod(listItem)); } // ... }</code>
Cette GetAllItems
méthode accepte désormais un Func<ListItem, T>
délégué. Ce délégué prend un ListItem
en entrée et renvoie une instance de type T
.
Utilisation :
<code class="language-csharp">GetAllItems<Foo>(..., l => new Foo(l)); </code>
Dans cet exemple, l'expression lambda l => new Foo(l)
sert de méthode d'usine. Il prend un ListItem
(l
) et l'utilise pour créer un nouvel objet Foo
à l'aide du constructeur de Foo
. Cela transmet effectivement l'argument ListItem
au constructeur Foo
.
Cette approche permet une instanciation flexible de types génériques, même ceux avec des constructeurs paramétrés, en séparant la logique de création d'objet de la méthode générique elle-même.
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!