C# 仅接受声明某些接口的类型

C# 仅接受声明某些接口的类型,c#,oop,types,interface,C#,Oop,Types,Interface,怎么做这样的事情 List<Type:IMyInterface> a = new List<Type:IMyInterface>; a.Add(typeof(MyClass1)); //MyClass1..3 implementing IMyInterface a.Add(typeof(MyClass2)); a.Add(typeof(MyClass3)); IMyInterface c = default(a[1]); //create MyClass2 object

怎么做这样的事情

List<Type:IMyInterface> a = new List<Type:IMyInterface>;
a.Add(typeof(MyClass1)); //MyClass1..3 implementing IMyInterface
a.Add(typeof(MyClass2));
a.Add(typeof(MyClass3));
IMyInterface c = default(a[1]); //create MyClass2 object
a.Add(typeof(Object)); //must fail
List a=新列表;
a、 添加(类型(MyClass1))//MyClass1..3实现IMI接口
a、 添加(类型(MyClass2));
a、 添加(类型(MyClass3));
IMyInterface c=默认值(a[1])//创建MyClass2对象
a、 添加(对象的类型)//必须失败

如果不先构造对象或稍后检查类型?

C#中不直接支持您想要的内容。由于类型参数的约束只能在构造函数、继承层次结构、接口实现和其他一些方面指定

您可以用另一种方法来完成,但是在这种方法中没有编译时错误:

公共接口IMyConstraint { 无效Do(); }

公共类MyClass:IMyConstraint
{
公营部门
{
}
}
//从List类继承以向其添加一些功能
公共类MyTypeList:列表,其中T:System.Type
{
公共MyTypeList()
{
}
//使用new关键字阻止客户端使用List.Add方法。
公共新空添加(T型)
{
//这里检查类型是否实现接口
如果(!typeof(IMyConstraint).IsAssignableFrom(type))
{
//如果它没有实现接口,就抛出一个异常
抛出新的InvalidOperationException();
}
//调用原始List.Add方法
添加(类型);
}
}

如果您知道静态涉及的类型,则可以执行此操作:

public class TypeList<T>
{
    private readonly List<Type> types = new List<Type>();
    public void Add<D>() where D : T, new()
    {
        this.types.Add(typeof(D));
    }

    public T NewAt(int index)
    {
        return (T)Activator.CreateInstance(this.types[index]);
    }
}
公共类类型列表
{
私有只读列表类型=新列表();
public void Add(),其中D:T,new()
{
本.types.Add(typeof(D));
}
公共T NewAt(整数索引)
{
return(T)Activator.CreateInstance(this.types[index]);
}
}
然后你可以做:

var a = new TypeList<IMyInterface>;
a.Add<MyClass1>();
a.Add<MyClass2>();
a.Add<MyClass3>();
IMyInterface c = a.NewAt(1);
a.Add<object>(); //won't compile
var a=新类型列表;
a、 添加();
a、 添加();
a、 添加();
imy接口c=a.NewAt(1);
a、 添加()//不会编译

default(a[1])将始终返回一个
null
,您需要更详细地描述用例。
default(Type t)
必须返回使用默认参数较少的构造函数创建的对象(如果存在)。在我的例子中,
typet
可以是
typeof(MyClass1..3)
。什么应该只接受类型,为什么?您想做什么?
default(a[1])
甚至不会被编译(为什么不
Activator.CreateInstance
?)。我建议您自己实现集合聚合
列表
,并在添加之前验证类型。谢谢。这是完整的答案。
var a = new TypeList<IMyInterface>;
a.Add<MyClass1>();
a.Add<MyClass2>();
a.Add<MyClass3>();
IMyInterface c = a.NewAt(1);
a.Add<object>(); //won't compile