Les listes en C# stockent plusieurs types génériques
Les types génériques en C# fournissent un mécanisme puissant pour créer des classes et des méthodes pouvant fonctionner sur différents types de données. Cependant, un problème courant survient souvent lorsque l’on tente d’utiliser plusieurs types génériques dans une liste.
Considérons l'exemple suivant :
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; } List<Metadata<DataType>> metadataObjects; //错误: DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
Le but ici est de créer une liste contenant des objets métadonnées de différents types de données. Cependant, la contrainte Metadata<DataType>
sur la classe where
restreint le type générique DataType
à un type valeur. Cela signifie metadataObjects
que chaque élément de la liste doit être du même type générique, il n'est donc pas possible d'ajouter des objets de types différents.
Pour surmonter cette limitation, une solution consiste à introduire une classe de base abstraite pour Metadata
comme suit :
<code class="language-csharp">public abstract class Metadata { } // 继承抽象 Metadata 类 public class Metadata<DataType> : Metadata where DataType : struct { private DataType mDataType; }</code>
En créant une classe de base abstraite Metadata
, une classe générique Metadata<DataType>
peut désormais étendre cette classe de base. Cela nous permet d'avoir une liste d'objets Metadata
où chaque élément peut être d'un type générique différent.
Le code modifié est le suivant :
<code class="language-csharp">List<Metadata> metadataObjects = new List<Metadata>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
Maintenant metadataObjects
les listes peuvent contenir des objets de différents types de valeur, atteignant ainsi l'objectif d'avoir plusieurs types génériques dans une liste. Il convient de noter que la conversion de type est requise lors de l'accès aux attributs mDataType
, car la classe de base Metadata
ne connaît pas le DataType
spécifique.
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!