2013-01-14 102 views
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>>(); 

我相信我能同时创建继承的情况下/使用以下电话(只有一个类将在构造函数的参数)

(AC_IC) Activator.CreateInstance(typeof(AC_IC), new object[] { vParameter}); 
    (II) Activator.CreateInstance(typeof(II)); 
从BaseClass的和抽象类中实现类

编辑:上面的调用是在BaseClass和AbstractClass中,因此不知道我将在随后使用哪些类,所以不能通过类名指定,可能有许多不同类的实现范围。

对于这两个构造函数调用,我都会收到错误'无法创建抽象类的实例'&'无法创建接口的实例'。我如何让编译器知道我作为泛型所传递的类是where子句中的类的子类,因此可以创建。

任何想法社区???

回答

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); 
} 
+0

我应该说的这两行代码都在BaseClass的和AbstractClass classess,所以不知道ExtendsAbstractClass和ImplementsInterface是否被使用,这个想法是创建这个解决方案作为一个框架,而不是具体到两个类 –

+0

@ColinSteel啊哈,我看你要去哪里,我想 - 你想要be ab le“去掉”实际的实施类是什么? – JerKimball

+0

是的,我认为使用参数化的泛型类型对我来说这样做,它似乎没有。 –