2017-03-22 5 views
3

Listの各メンバがMyClassのサブクラスであるクラス型のリスト(Classインスタンスのリストではありません)が必要です。C# - サブクラスのリストタイプ

List<System.Type> myList; 
myList.Add(typeof(mySubClass)); 

をしかし、私は唯一のMyClassのサブクラスを受け入れるようにリストを制限したいと思います:

例えば、私はこれを行うことができます。

これは質問like thisとは異なります。 理想的には私のプロジェクトでは現在使用されていないので、私はlinqを避けたいと思います。

+2

作成を更新する必要があります独自のリストそれはListから継承し、 'Add'メソッドをオーバーライドします。 – dcg

+1

コンパイル時に確認できないと思います。独自のリストを作成して追加することもできます。 – Jonesopolis

+1

@dcgこれは、 'Add'が仮想ではないので、これをまったく実行できません。リストを継承するのではなく、リストを作成する必要があります。 – Servy

答えて

3

Servy is right in his commentおよびLee in hisit's much more preferable to compose than inherit。だから、これは良いオプションです:

public class ListOfTypes<T> 
{ 
    private List<Type> _types = new List<Type>(); 
    public void Add<U>() where U : T 
    { 
     _types.Add(typeof(U)); 
    } 
} 

使用法:あなたは他のコードを与えたい場合は、このクラスはIReadOnlyList<Type>のようなインターフェイスを実装することができます

var x = new ListOfTypes<SuperClass>(); 
x.Add<MySubClass>() 

注意せずに含まれるType sの読み取りアクセスを他のコードはこのクラスに依存する必要があります。

しかし、あなたはとにかく継承させたい場合は、あなたがListから継承する独自のクラスを作成することができ、このようなあなた自身のジェネリックAddメソッドを追加します。

public class ListOfTypes<T> : List<Type> 
{ 
    public void Add<U>() where U : T 
    { 
     Add(typeof(U)); 
    } 
} 

だけwhat Lee saidの点に注意してください。この第二のバージョンであなたはまだAdd(typeof(Foo))です。

+2

'Add(typeof(string))'を行うこともできるので、継承は避けています。 – Lee

+0

ここでの決定的なアプローチに感謝します。 –

1

リストからリストクラスを派生させ、Addメソッドをオーバーライドして必要な型チェックを実行する必要があります。私はそれを自動的に行うための.NETの方法を知らない。

このような何かは仕事ができる:

public class SubTypeList : List<System.Type> 
{ 
    public System.Type BaseType { get; set; } 

    public SubTypeList() 
     : this(typeof(System.Object)) 
    { 
    } 

    public SubTypeList(System.Type baseType) 
    { 
     BaseType = BaseType; 
    } 

    public new void Add(System.Type item) 
    { 
     if (item.IsSubclassOf(BaseType) == true) 
     { 
      base.Add(item); 
     } 
     else 
     { 
      // handle error condition where it's not a subtype... perhaps throw an exception if 
     } 
    } 
} 

あなたは、他のリストに/更新項目を追加する方法(インデックスセッター、AddRange、挿入、など)

関連する問題