Maison >développement back-end >C++ >Une liste C# peut-elle contenir plusieurs instances de classe générique avec différents paramètres de type ?

Une liste C# peut-elle contenir plusieurs instances de classe générique avec différents paramètres de type ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 16:36:09605parcourir

Can a C# List Hold Multiple Generic Class Instances with Different Type Parameters?

Pouvez-vous créer une liste de types génériques en C# ?

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!

Déclaration:
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