2013-05-02 89 views
3

由於問題範圍之外的原因,我需要動態創建一個從基類繼承的子類的實例,調用一個構造函數,該函數不存在使用傳遞的參數到基類的構造函數使用基礎構造函數創建實例

使用下面的例子:應該創建一個ExampleClass的實例將值發送到argument1BaseClass

class BaseClass 
{ 
    public BaseClass() 
    { 

    } 
    public BaseClass(string argument1) 
    { 
     //... 
    } 
} 

class ExampleClass : BaseClass 
{ 
    public ExampleClass() 
    { 
    } 
} 

編輯:我做了另外一個話題,我說明來源或我的問題: Entity Framework DbContext dynamic instatiation with custom Connection String

+2

你的問題不是很清楚。 – tnw 2013-05-02 14:16:56

+0

你能描述爲什麼你不能簡單地做'public ExampleClass(s​​tring s):base(s){}'? – 2013-05-02 14:19:06

+0

public ExampleClass():base(「someValue」){} ----? – jure 2013-05-02 14:19:17

回答

0

你想調用基類的構造函數?

public ChildClass(string arg1) : base(arg1) 
{ 
    //above will invoke base constructor that takes a string argument 
} 
+0

嗨,詹姆斯,謝謝4你的答案,請看我的答案在那裏 – Tuk 2013-05-02 14:26:25

0

我看到要做到這一點的唯一方法是添加一個ParentClass構造函數。我沒有做任何事情,所以我不明白你爲什麼不能添加它:

public ParentClass(string argument1) : BaseClass(argument1) 
{ 
} 
+0

謝謝4你的答案邁克,問題是,在我的應用程序的上下文中,我不能創建缺少的構造函數,所以我認爲應該有一個工作 - 使用反射周圍 – Tuk 2013-05-02 14:24:41

+1

此代碼不會編譯,這不是C++。 – svick 2013-05-02 14:37:11

0

試試這個:

class ExampleClass : BaseClass 
{ 
    public ExampleClass() 
     : base(Properties.Settings.Default.MyArgument) 
    { 
    } 
} 

您可以依次在通過使用Properties.Settings.Default.MyArgument您需要在基類構造函數中使用的參數的值,而不必在每次需要更改參數值時修改源代碼(只需將其添加到項目的設置,應用程序範圍)。

2

如果我理解它是正確的,你不能修改ExampleClass,但需要創建一個實例,它使用基類的不同構造函數?

我相信沒有建立在框架中的方式來實現它,即使有反思。 所以你的目標應該是繞過框架並使用MSIL

但是,我在SO上找到的這個話題看起來很有希望。

Dynamically create type and call constructor of base-class

+0

嗨!我看到可能有辦法。鏈接的問題讓我想我可以創建dinamically的「部分」類型,我不能在代碼上創建,幷包含我需要的構造函數。 – Tuk 2013-05-02 15:01:29

-1

如果您不能添加非默認構造函數的ChildClass,然後不,你不能創建ChildClass的調用基類構造一個實例。構造函數不會被繼承。然後你需要重構你的基類,這樣就可以不使用構造函數來設置參數。例如見下圖:

class BaseClass 
{ 
    public BaseClass() 
    { 

    } 
    public BaseClass(string argument1) 
    { 
     Init(argument1); 
    } 

    public void Init(string argument1) 
    { 
     //... 
    } 
} 

class ExampleClass : BaseClass 
{ 
    public ExampleClass() 
    { 
    } 
} 

然後你就可以創建你ExampleClass的實例,並調用Init方法來初始化:

ExampleClass e = (ExampleClass)Activator.CreateInstance.... // or whatever 
e.Init(arugment); 
+0

op說,他不能修改ExampleClass或BaseClass – 2013-05-02 16:34:03

相關問題