C# のリストには複数のジェネリック型が格納されます
C# のジェネリック型は、さまざまなデータ型を操作できるクラスとメソッドを作成するための強力なメカニズムを提供します。ただし、リスト内で複数のジェネリック型を使用しようとすると、よくある問題が発生します。
次の例を考えてみましょう:
<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>
ここでの目標は、さまざまなデータ型のメタデータ オブジェクトを含むリストを作成することです。ただし、Metadata<DataType>
クラスの where
制約は、ジェネリック型 DataType
を値型に制限します。これは、metadataObjects
リスト内の各項目は同じジェネリック型でなければならないため、異なる型のオブジェクトを追加することはできないことを意味します。
この制限を克服するための 1 つの方法は、次のように Metadata
の抽象基本クラスを導入することです。
<code class="language-csharp">public abstract class Metadata { } // 继承抽象 Metadata 类 public class Metadata<DataType> : Metadata where DataType : struct { private DataType mDataType; }</code>
を作成すると、汎用クラス Metadata
がこの基本クラスを拡張できるようになります。これにより、各項目が異なるジェネリック型になることができる Metadata<DataType>
オブジェクトのリストを持つことができます。 Metadata
<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>
リストはさまざまな値型のオブジェクトを保持できるようになり、リスト内に複数のジェネリック型を含めるという目標を効果的に達成できます。 metadataObjects
基本クラスは特定の mDataType
を知らないため、Metadata
属性にアクセスする場合は型変換が必要であることに注意してください。 DataType
以上がC# で複数のジェネリック型を 1 つのリストに保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。