En C#, vous pouvez créer une classe avec des paramètres de type génériques. Cependant, est-il possible de créer une liste contenant plusieurs instances différentes de cette classe générique avec différents paramètres de type ?
Considérons l'exemple suivant :
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; }</code>
Ici, nous avons une classe générique Metadata
qui peut être utilisée pour différents types de valeur. Maintenant, disons que nous voulons créer une liste de ces Metadata
objets, qui ont différents types. Pouvons-nous le faire ?
<code class="language-csharp">List<Metadata<DataType>> metadataObjects; // 错误:DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
Malheureusement, cela n'est pas possible en C# car le paramètre de type générique d'une liste doit être le même pour tous les éléments. Pour surmonter cette limitation, l'héritage et les classes abstraites peuvent être utilisés.
<code class="language-csharp">public abstract class MetadataBase { } // 继承抽象 MetadataBase 类 public class Metadata<DataType> : MetadataBase where DataType : struct { private DataType mDataType; }</code>
Vous pouvez maintenant créer une liste de classes de base abstraites MetadataBase
. Cela permet d'ajouter différents types d'objets Metadata
à la liste :
<code class="language-csharp">List<MetadataBase> metadataObjects = new List<MetadataBase>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
En utilisant une classe de base abstraite, nous créons avec succès une liste pouvant contenir des instances de différents types Metadata
. Il est à noter qu'une conversion de type est requise lors de l'accès à l'attribut mDataType
d'un élément de la liste, car MetadataBase
ne contient pas cet attribut. Cela doit être traité au cas par cas, par exemple en utilisant les types dynamic
ou l'opérateur is
pour la vérification et la conversion de type.
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!