我有三个类,一个基类采用泛型类型,它必须是抽象类的子类,后者又采用必须实现接口的泛型类型。
为了测试我有一个表单,它将启动基类,给出抽象类的子类和接口的实现。这是我的类声明,并调用基类构造函数。
public class BaseClass<AC_IC> where AC_IC : AbstractClass<InterfaceClass>
public abstract class AbstractClass<IC> where IC: InterfaceClass
public interface InterfaceClass
public class ExtendsAbstractClass<II> : AbstractClass<InterfaceClass>
public class ImplementsInterface : InterfaceClass
vBC = new BaseClass<ExtendsAbstractClass<ImplementsInterface>>();
我相信我可以使用以下调用在BaseClass和AbstractClass中创建两个继承/实现类的实例(只有一个类在构造函数中有参数)
(AC_IC) Activator.CreateInstance(typeof(AC_IC), new object[] { vParameter});
(II) Activator.CreateInstance(typeof(II));
编辑:上面的调用在BaseClass和AbstractClass中,因此不知道我将在后面使用哪些类,因此不能通过类名指定,可能有许多不同的类对用于一系列实现。
对于这两个构造函数调用,我得到错误'无法创建抽象类的实例'和&amp; '无法创建接口的实例'。我怎样才能让编译器知道我作为泛型类型传递的类是where
子句中类的子类,因此可以创建。
任何想法社区???
答案 0 :(得分:1)
错误不言而喻:您无法创建抽象类型的实例。
你 CAN 将结果类型转换回基本类型,即:
(AC_IC) Activator.CreateInstance(
typeof(BaseClass<ExtendsAbstractClass<ImplementsInterface>),
new object[] { vParameter});
编辑:
public TFinal MakeMeA<TOuter,TInner,TInnermost,TFinal>(params object[] additionalCrap)
{
// figure out innermost type
var innermostType = typeof(TInner).MakeGenericType(typeof(TInnermost));
// work outwards
var nextLevel = typeof(TOuter).MakeGenericType(innermostType);
// figure out what the heck we're making
var returnType = typeof(TFinal).MakeGenericType(nextLevel);
// And make one of those
return (TFinal)Activator.CreateInstance(returnType, additionalCrap);
}