我想覆蓋自定義dll中ClassA的打印方法。「在運行時覆蓋方法」C#
public ClassA
{
public void Print(string arg1, string arg2, string arg3, string arg4)
{
}
}
這是可能的C#?
我想覆蓋自定義dll中ClassA的打印方法。「在運行時覆蓋方法」C#
public ClassA
{
public void Print(string arg1, string arg2, string arg3, string arg4)
{
}
}
這是可能的C#?
你的第一個問題:該方法不標明virtual
。你不能override
一個非虛擬的方法。
至於這個問題,這一切都取決於如何ClassA
被實例化和使用。例如,你可以在運行時創建一個派生類型,如果你可以控制它的實例化和使用。
我相信痣微軟研究院做類似的事情。他們有一個系統,可以讓你覆蓋例如DateTime.Now
,迫使它返回一個特定的日期/時間。
看一看http://research.microsoft.com/en-us/projects/pex/default.aspx以獲取更多信息。
痣這樣做,不Pex的 – Kikaimaru 2010-11-04 11:02:05
謝謝,更新的答案。 – 2010-11-04 11:03:57
這是不太一樣的東西,你都在問,但它實現了類似的效果...
爲什麼不定義一個接口爲您的操作。 ClassA實現接口。您的自定義策略也實現了界面。 ClassA在啓動時(在ClassA實例化時)在內部創建接口的「默認」實現,但也有一個允許設置接口的屬性。接口甚至可以允許用戶定製的策略來指定,它實際上實現了接口的成員:
interface IStrategy
{
void Operation1(int x, int y);
void Operation2(string a, string b);
}
class ClassA : IStrategy
{
private IStrategy builtInStrategy = new BuiltInStrategy();
public IStrategy CustomStrategy { get; set; }
void Operation1(int x, int y);
{
if (CustomStrategy != null)
{
CustomStrategy.Operation1(x, y);
}
else
{
builtInStrategy.Operation1(x, y);
}
}
void Operation2(string a, string b)
{
if (CustomStrategy != null)
{
CustomStrategy.Operation2(a, b);
}
else
{
builtInStrategy.Operation2(a, b);
}
}
}
你可以指定爲IStrategy的一部分對接的方式爲用戶定製的策略,以表明它是不是「壓倒一切「一個特定的操作。也許它可能會返回bool
而不是空白,或者如果自定義策略未覆蓋某個操作,則每個操作都可能有一個out bool
參數設置爲false。
根據有多少操作可以被覆蓋,你甚至可以考慮將每個操作自己的接口。如果不實施一項操作而不實施一些其他操作是不合理的,則操作可以被分組在接口中。
interface IOperation1
{
void Operation1(int x, int y);
}
interface IOperation2
{
void Operation2(string a, string b);
}
interface IMath
{
int Add(int i, int j);
int Subtract(int i, int j);
int Multiply(int i, int j);
int Divide(int i, int j);
}
interface IStrategy
{
//What operations should the Strategy have?
}
class ClassA : IOperation1, IOperation2, IMath
{
public IStrategy CustomStrategy { get; set; }
public void Operation1(int x, int y)
{
IOperation1 op1 = CustomStrategy as IOperation1;
if (op1 != null)
{
op1.Operation1(x, y);
}
else
{
//Do ClassA's Operation1 logic here
}
}
public void Operation2(string a, string b)
{
IOperation2 op2 = CustomStrategy as IOperation2;
if (op2 != null)
{
op2.Operation2(a, b);
}
else
{
//Do ClassA's Operation2 logic here
}
}
//
// And so on ...
//
}
這是不可能的,因爲我不能延長ClassA的,因爲它是與應用交付的核心DLL
請澄清:你想重寫/陰影/隱藏外國類的方法?你*真的*想在運行時做這個*而不是*設計時* *? – Bobby 2010-11-04 10:51:42
@Bobby:Shadowing在運行時不會幫助一點。它在編譯時解決。 – leppie 2010-11-04 10:53:53
@leppie:這就是爲什麼我問他*真的想做什麼。 – Bobby 2010-11-04 11:02:11