3

タイプのリストを作成したいと思います。各タイプは特定のインターフェースを実装する必要があります。好き:

interface IBase { }
interface IDerived1 : IBase { }
interface IDerived2 : IBase { }

class HasATypeList
{
    List<typeof(IBase)> items;
    HasATypeList()
    {
        items.Add(typeof(IDerived1));
    }

}

だから私は私ができることを知っています

List<Type> items;

ただし、リストで許可されるタイプは、IBaseを実装するタイプに限定されません。独自のリストクラスを作成する必要がありますか?それは大したことではありませんが、私がする必要がなければ...

4

3 に答える 3

4

typeof(IBase)、、、はすべてtypeof(object)、同じメンバーを持つ、typeof(Foo)のインスタンスを返します。Type

あなたが何を達成しようとしているのか、なぜそれらを区別したいのかわかりません。

実際、ここで書いているコードは次のとおりです。

List<typeof(IBase)> items;

(これがコンパイルされるかどうかさえわかりませんか?)これとまったく同じです:

List<Type> items;

ですから、実際、あなたが達成しようとしていることは、私見では役に立たないのです。

本当にこれを達成したいのであれば-しかし理由はわかりません...-、Olivier Jacot-Descombesが提案しているように、いつでも独自のコレクションタイプを作成できますが、その場合は、継承するタイプを作成したいと思いますCollection<T>代わりに:

public class MyTypeList<T> : Collection<Type>
{
    protected override InsertItem( int index, Type item )
    {
        if( !typeof(T).IsAssignableFrom(item) )
        {
            throw new ArgumentException("the Type does not derive from ... ");
        }

        base.InsertItem(index, item);
    }
}
于 2012-11-07T20:54:05.937 に答える
1

はい。タイプがIBaseのサブクラスでない場合は、例外をスローするリストを実装する必要があります。

あなたがやりたいことをするための組み込みの方法はありません。

于 2012-11-07T20:55:05.833 に答える
1

そのための唯一の方法は、独自のタイプコレクションを作成することです。

public class MyTypeList
{
    List<Type> _innerList;

    public void Add(Type type)
    {
        if (typeof(IBase).IsAssignableFrom(type)) {
             _innerList.Add(type);
        } else {
            throw new ArgumentException(
                "Type must be IBase, implement or derive from it.");
        }
    }

    ...
}
于 2012-11-07T20:59:09.383 に答える