2012-08-17 29 views
1

我有一個來自供應商的C#DLL。我已經提取了源代碼,但它不是我自己修改它的選項。重寫DLL的方法

Supose的dll具有這些類(在相同的命名空間):

public static class A { 
    public static string Method1(this Helper helper, B options) { 
     ... 
    } 
} 

public class B { 
    public int LoadingElementDuration { 
     get; 
     set; 
    } 

    public string Method2() { 
     ... 
    } 
} 

A類是所有細。這是我們使用的類。 是否可以修改B類?我想添加一個屬性並用我自己的代碼覆蓋Method2。然後A類應該使用我的代碼而不是默認類B.

謝謝。

+0

看看適配器模式。 – Tomtom 2012-08-17 09:24:58

回答

0

不,您只能擴展功能而不能更改現有的功能。

3

不,這是不可能的,因爲Method2是密封的。您可以從B編寫派生類並添加新屬性,但無法覆蓋Method2。如果Method2是虛擬的,這將是可能的。

+0

不,方法2不密封(在他的例子中) – shajivk 2012-08-17 07:10:10

+2

當然,它是密封的。 B類沒有實現任何接口,並且該方法沒有用虛擬關鍵字標記。 – 2012-08-17 07:10:40

1

您可以複製此dll的所有內容,並將其粘貼到具有相同類名的新創建的類庫中。然後你可以隨意修改它。

0

這個人爲什麼說這是不可能的?我錯過了什麼嗎? 做一個派生類,添加屬性,用「新」重寫方法

public class C : B 
{ 
    //add property here 

    public new string Method2() 
    { 

    } 
} 

那麼讓我們來看看有什麼我們正在這裏:

如果您不需要使用添加的屬性中方法一(這個時刻是不是從你的問題很清楚):

C options = new C(); 
//init here 
helper.Method1(options); //this will cast your object of C class to object of B class and your added property will be inaccessible. 

但是,如果你需要改變執行方法1的使用你的財產,你可以嘗試做這樣:

public static class CHelper 
{ 
    public static string Method1(this Helper helper, C options) 
    { 

    } 
} 

,寫自己的實現方法一

+1

而'Method1'不會調用它,因爲他接受'B'作爲參數,並且會忽略這個僞覆蓋。 – 2012-08-17 07:09:45

+0

如何阻止他編寫另一個使用他的類的實例作爲選項的擴展方法? – dantix 2012-08-17 07:17:00

+0

那麼,據我看到,OP希望類'A'使用他的類'B'版本,而不需要自己實現所有的代碼。 – 2012-08-17 07:19:27

0

。如果ClassA->方法1是從你的代碼中調用,所有你需要做的是延長ClassA和ClassB的並添加您需要的方法。

+0

不,他說他使用的是A類_Class A沒有問題。這是我們使用的類 – shajivk 2012-08-17 07:22:03

-1

創建一個新的類,從ClassB的繼承,創建一個新的方法2與關鍵字新的,這就是它