具有抽象类和接口的泛型类型

本文关键字:泛型类型 接口 抽象类 | 更新日期: 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);
}