具有抽象类和接口的泛型类型
本文关键字:泛型类型 接口 抽象类 | 更新日期: 2023-09-27 17:52:54
我有三个类,一个基类采用泛型类型,该泛型类型必须是抽象类的子类,而抽象类采用泛型类型,必须实现接口。
对于测试,我有一个表单,它将启动基类,给出抽象类的子类和接口的实现。下面是我的类声明,以及对基类构造函数的调用。 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中,因此不知道我随后将使用哪些类,因此不能通过类名指定,对于一系列实现可能有许多不同的类对。
对于这两个构造函数调用,我得到错误'不能创建一个抽象类的实例' &"无法创建接口实例"。我怎样才能让编译器知道我作为泛型类型传递的类是where
子句中类的子类,因此可以创建。
有什么想法吗??
这些错误不言自明:您不能创建抽象类型的实例。
可以将结果类型强制转换回基类型,即:
(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);
}