我有程序集A,A有兩個類a和b。覆蓋引用程序集的類
A.a在其某些方法中使用A.b。
在我的程序集B中,我有兩個類B.a和B.b.
B.a繼承A.a和B.b繼承自A.b.
如何讓B.a在使用A.b的方法中使用B.b而不是A.b,而無需訪問源代碼?
我有程序集A,A有兩個類a和b。覆蓋引用程序集的類
A.a在其某些方法中使用A.b。
在我的程序集B中,我有兩個類B.a和B.b.
B.a繼承A.a和B.b繼承自A.b.
如何讓B.a在使用A.b的方法中使用B.b而不是A.b,而無需訪問源代碼?
如果沒有A的源代碼,並且A不會像使用IoC來解析A.b那樣做任何事情,那麼您不能。 A.a和A.b之間的依賴關係在編譯時設置,並且可能沒有簡單的方法來截取它。
如果使用A.b的A.a中的方法是虛擬的,那麼您可以重寫它們,並使用B.b重現其功能。
沒有A.a的支持?除了對IL(ildasm)進行hackery反編譯,更改並重新編譯(ilasm)之外,沒有其他任何內容。如果組件A具有強名稱(有符號),則這將不起作用
A
中的方法需要標記爲virtual
以便您可以覆蓋它們。
嗯,這裏有兩個問題。
首先,您應該製作A.a中的方法,您打算從A.b中使用(並因此在B.b中「替換」)虛擬。這確保您可以在B.b.中覆蓋它們。
然而,無論是機管局訪問抗體通過靜態方法(它不能被重寫),或通過抗體的實例(你不能輕易更換。)
您除了需要做什麼如上所述,使方法變爲虛擬的方法也是在Aa中提供一個工廠方法,它創建一個Ab實例,然後使用該方法的結果,然後在Ba中覆蓋此方法。
讓我這個LINQPad程序演示:
void Main()
{
Ba instance = new Ba();
instance.UseB();
}
public class Aa
{
public void UseB()
{
Ab instance = CreateB(); // <-- call factory method instead of new
instance.Test();
}
public virtual Ab CreateB()
{
return new Ab();
}
}
public class Ab
{
public virtual void Test()
{
Debug.WriteLine("A.b.Test");
}
}
public class Ba : Aa
{
public override Ab CreateB() // <-- it still returns type "Ab"
{
return new Bb(); // <-- just create an instance of Bb instead
}
}
public class Bb : Ab
{
public override void Test()
{
Debug.WriteLine("B.b.Test");
}
}
很難回答沒有看到任何代碼。 A組中的方法中的所有方法都標記爲「虛擬」? – 2011-05-22 21:05:18
他們是如何「使用」?他們是參數類型嗎?代碼中的局部變量? – 2011-05-22 21:06:16
你沒有A的來源而不是B嗎? – 2011-05-22 21:09:32