2011-07-18 32 views
0

我想動態覆蓋虛擬基類功能,並在應用程序中使用此重寫方法。如果我寫一個基本的示例類:c#加載即時生成的部分類彙編

partial Class myBase 
{ 
    public myBase() {} 
    public virtual void DoStuff() 
    { 
     throw new Exception("this function is not overriden"); 
    } 
} 

partial Class myDeriv : myBase 
{ 
    public myDeriv() {} 
} 

現在我想在運行中覆蓋myDeriv.DoStuff。 所以我創建一個字符串代碼塊,並使用

CSharpCodeProvider.CompileAssemblyFromSource

方法編譯。在將此dll寫入磁盤後,我嘗試使用它加載它

Assembly.LoadFrom("onTheFly.dll"); 

但是,應用程序無法找到此重寫的函數。如果您還有其他更好的解決方案,我也向他們開放..我只需要在飛行中覆蓋功能..

謝謝大家!

+0

我們需要一些更多的信息:在哪些程序集是這些類,我們需要看到代碼覆蓋這些類的代碼 – hcb

+0

不太確定您是否可以隨時覆蓋虛擬功能。但也許你可以使用「新」關鍵字來「覆蓋」你的非虛函數? – Tigran

+0

@hcb我寫了包含基類和派生類的程序集(我修正了這些類的部分示例代碼)。我想創建動態組合或創建,編譯新的重寫方法並附加到此派生類。 – MCA

回答

1

我認爲這是不可能的似乎是相同的規則描述here或從原來的here

報價造成的:

「你不能有兩個部分類指的是同一兩個 不同的程序集(項目)。一旦程序集被編譯, 元數據被烘焙,並且你的類不再是部分的。部分 類允許你將同一類的定義分成兩個 文件「。

「不能使用的部分關鍵詞來拆分碼的項目之間的類 的部分關鍵詞是一個編譯器特技;所述 編譯器將輸出一個單一的類出來的所以 如果你想擴展一個現有的類你會或者需要 繼承它(如果它不是密封的),或者創建您自己的新類, 包含您希望合併信息的類。「