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

时间:2013-01-14 19:35:44

标签: c# generics inheritance

我有三个类,一个基类采用泛型类型,它必须是抽象类的子类,后者又采用必须实现接口的泛型类型。

为了测试我有一个表单,它将启动基类,给出抽象类的子类和接口的实现。这是我的类声明,并调用基类构造函数。

    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子句中类的子类,因此可以创建。

任何想法社区???

1 个答案:

答案 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);
}