如何做这样的事情
{{1}}
不首先构造对象或稍后检查类型?
答案 0 :(得分:3)
C#中不直接支持您想要的内容。因为Constraints on Type参数只能在构造函数,继承层次结构,接口实现和其他一些参数上加以说明。 more details
你可以用不同的方式做到这一点,但是在这种方法中没有编译时错误:
公共接口IMyConstraint { void Do(); }
public class MyClass: IMyConstraint
{
public void Do()
{
}
}
// Inherit from the List class to add some functionality to it
public class MyTypeList<T> : List<T> where T : System.Type
{
public MyTypeList()
{
}
// use new keyword to prevent client from using the List.Add method.
public new void Add(T type)
{
// here you check if the type is implementing the interface or not
if (!typeof(IMyConstraint).IsAssignableFrom(type))
{
// if it dose not implement the interface just throw an exception
throw new InvalidOperationException();
}
// call the original List.Add method
base.Add(type);
}
}
答案 1 :(得分:2)
如果你知道静态涉及的类型,你可以这样做:
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]);
}
}
然后你可以这样做:
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