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

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

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

于 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 回答