0

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

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

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

任何想法社区?

4

1 回答 1

1

错误不言自明:您不能创建抽象类型的实例。

您可以结果类型转换回基本类型,但:

 (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);
}
于 2013-01-14T19:41:24.613 回答