有沒有辦法在C#中透明地包裝其他方法的方法?我想實現Moose的功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:其他方法的包裝方法
編輯:而透明我的意思是沒有修改原來的方法。
有沒有辦法在C#中透明地包裝其他方法的方法?我想實現Moose的功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:其他方法的包裝方法
編輯:而透明我的意思是沒有修改原來的方法。
我認爲你在尋找什麼叫做面向方面編程。有很多C#庫可以幫助解決這個問題。其中一個名爲PostSharp(PostSharp的免費版本支持此功能)。這裏是一個類似於駝鹿示例的例子。這將創建您可以在其他方法使用跟蹤屬性就這一額外功能的策略:
[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Trace.WriteLine("about to call method");
}
public override void OnExit(MethodExecutionArgs args)
{
Trace.WriteLine("just finished calling method");
}
}
你將它添加到方法「富」通過將跟蹤前右它的屬性:
[Trace]
public void Foo() { /* ... */ }
現在,當Foo執行時,上面的OnEntry方法將在它之前運行,並且OnExit將在其後運行。
我可以修改參數,因爲它們傳遞給函數?我看到我收到了他們,但我無法從文檔中看出我是否可以改變它們。 – rpkelly 2011-02-02 05:57:43
的確,他們在.NET中被稱爲「代表」。請參閱:
尋求幫助。
關閉。但是我需要在不改寫原始方法的情況下做到這一點。這就是我透明的意思。雖然,這是整潔:) – rpkelly 2011-02-01 21:40:07
不,不是它在穆斯完成的方式。你可能想看看一些AOP庫。
您可以使用動態代理實現相同的效果。一個例子是Castle Dynamic Proxy。
這樣的框架利用C#反射設施來構造'代理'或'包裝'類。所以記住這一點。因爲這個,有一定的開銷。或者,你可以使用框架,可以create classes statically via code generation。
一些隔離庫實現了允許用「繞行」或模擬方法替換調用方法的功能。您可能能夠使用相同的功能來實現您所指的攔截。欲瞭解更多詳情,請查看以下內容:
Rhino Mocks stubs and mocks are only good for interfaces?
你可能會用一些漂亮的反射,但我不認爲它會很漂亮... – Alxandr 2011-02-01 21:30:37