2008-11-21 46 views
0

C#3.0擴展方法將擴展添加到基類型,使該類型的所有實例的實例合法。在C#中模擬IDispatchEx#

現在,我認識的JavaScript實現了IDispatchEx,通過它可以將方法添加到特定實例。

那麼如何將一組方法添加到C#類的「實例」中?我知道這是一個動態與靜態語言聖戰的領土。 :)讓我澄清我的意圖是不是。

我只是想能夠添加一組事件到接口,取決於實現該接口的類。

我能做到這一點使用泛型

inteface ISample<T> { T SupportedEvents; } 

class Sample : ISample<UIWidgetEvent> { } 
class Sample2 : ISample<NonVisualUIWidget> { } 

class UIWidgetEvent { public EventHandler Clicked; } 
class NonVisualUIWidget {public EventHandler Expired;} 

class TestSample 
{ 
    public void Test() 
    { 
     new Sample().SupportedEvents.Clicked += ... 
     new Sample2().SupportedEvents.Expired += ... 
    } 
} 

然後我不喜歡SupportedEvents我希望能夠說

new Sample().Clicked +=... 

後來我想的JavaScript(我知道C#JS:))... AND IDispatchExIL Weaving,Reflection.Emit等等等等等等等等,想想可能有辦法做到這個...... [設計時間支持會很好,但是我可以沒有]

是的,我可能可以用Visitor模式來做這個「實例增強」。 [不知道我是否可以得到syntally糖]

評論?

回答

2

那麼,你可以爲你的「新」方法創建一個DynamicMethod實例,但是在運行時靜態地將它們附加到現有的實例將不起作用,因爲它不會被編譯。

可能(我還沒有試過這個)能夠將操作碼發送到內存中的程序集,但是這與你可以獲得的「語法上的甜蜜」差不多(會涉及很多我認爲)

它也可能是值得研究擴展方法 - 雖然我從來沒有嘗試通過擴展方法附加事件或類似事件的方法......並且它們只有3.5,所以這可能會限制你。

的最好看,「純C#」實現可能的東西非常相似,你已經與通用/接口設置了......

老實說,如果你正在尋找的東西與真正的「動態支持「,我會用支持DLR的語言(比如IronPython)來做這類東西,並從C#中調用它。

+0

JerKimball,有趣的想法...謝謝... +1建議DLR ... – 2009-01-08 19:57:39