2013-01-14 138 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

是的,我認爲使用參數化的泛型類型對我來說這樣做,它似乎沒有。 –