Maison > développement back-end > C++ > Comment puis-je créer une liste de types génériques ouverts en C# ?

Comment puis-je créer une liste de types génériques ouverts en C# ?

DDD
Libérer: 2025-01-11 08:42:40
original
776 Les gens l'ont consulté

How Can I Create a List of Open Generic Types in C#?

Gestion des listes de types génériques ouverts en C#

Travailler avec des types génériques ouverts (génériques avec des paramètres de type non spécifiés) en C# présente des défis en raison des limitations du polymorphisme générique.

Le défi :

Considérez ces cours :

public abstract class Data<T> { }

public class StringData : Data<string> { }

public class DecimalData : Data<decimal> { }
Copier après la connexion

La tentative de création d'une liste contenant des instances de ces différents Data types échoue directement :

List<Data> dataCollection = new List<Data>(); // Compiler error!
dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());
Copier après la connexion

L'erreur du compilateur se produit car Data est un type générique ouvert, nécessitant un argument de type.

La solution :

L'absence d'opérateur diamant en C# empêche l'instanciation directe de listes de génériques ouverts. Le polymorphisme ne s'applique pas directement aux types génériques ouverts. La solution de contournement consiste à utiliser un type ou une interface de base commune :

public interface IData { void SomeMethod(); }

public abstract class DataBase { public abstract void SomeMethod(); }
Copier après la connexion

Maintenant, vous pouvez créer une liste en utilisant l'interface ou la classe de base :

List<IData> dataList = new List<IData>();
dataList.Add(new StringData()); // StringData must implement IData
dataList.Add(new DecimalData()); // DecimalData must implement IData

foreach (var item in dataList)
    item.SomeMethod();


List<DataBase> dataBaseList = new List<DataBase>();
dataBaseList.Add(new StringData()); // StringData must inherit from DataBase
dataBaseList.Add(new DecimalData()); // DecimalData must inherit from DataBase

foreach (var item in dataBaseList)
    item.SomeMethod();
Copier après la connexion

Cette approche permet une collection de différents Data types, mais elle sacrifie un typage fort par rapport à une solution véritablement générique. L'exemple SomeMethod() met en évidence la nécessité d'une interface commune ou d'une méthode abstraite pour maintenir les fonctionnalités entre différents types.

Lectures complémentaires :

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal