2008-11-21 48 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