我想创建一个类型列表,每个类型都必须实现一个特定的接口。像:
interface IBase { }
interface IDerived1 : IBase { }
interface IDerived2 : IBase { }
class HasATypeList
{
List<typeof(IBase)> items;
HasATypeList()
{
items.Add(typeof(IDerived1));
}
}
所以我知道我可以做到
List<Type> items;
但是这不会将列表中允许的类型限制为实现IBase的类型。我是否必须编写自己的列表类?并不是说这是一个大问题,但如果我不需要......
答案 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.");
}
}
...
}