在C#中创建类型列表

时间:2012-11-07 20:50:24

标签: c# reflection collections

我想创建一个类型列表,每个类型都必须实现一个特定的接口。像:

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

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

}

所以我知道我可以做到

List<Type> items;

但是这不会将列表中允许的类型限制为实现IBase的类型。我是否必须编写自己的列表类?并不是说这是一个大问题,但如果我不需要......

3 个答案:

答案 0 :(得分:3)

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);
    }
}

答案 1 :(得分:1)

是。如果type不是IBase的子类,则必须实现一个抛出异常的List。

没有内置的方法来做你想做的事。

答案 2 :(得分: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.");
        }
    }

    ...
}