0

C# 3.0 扩展方法向基类型添加扩展,使得在该类型的所有实例上调用该方法都是合法的。

现在,我知道的 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 IDispatchEx, IL Weaving,Reflection.Emit等等等等,并认为可能有办法做到这一点... [设计时支持会很好,但我可以没有]

是的,我可能可以用访客模式来做这个“实例增强”。[不确定我是否可以得到合成糖]

评论?

4

1 回答 1

2

好吧,您可以为您的“新”方法创建一个 DynamicMethod 实例,但是在运行时将它们静态附加到现有实例是行不通的,因为它根本无法编译。

可能(我还没有尝试过)能够将操作码发送到内存中的程序集中,但这与您所能获得的“语法上的甜蜜”相去甚远(将涉及大量反射和 InvokeMember 调用,我会认为)

也可能值得研究扩展方法 - 尽管我从未尝试通过扩展方法附加事件或类似事件的方法......而且它们只是 3.5,所以这可能会限制你。

最好看的“纯 C#”实现可能与您已经通过通用/接口设置获得的非常相似......

老实说,如果您正在寻找像这样具有真正“动态支持”的东西,我会用支持 DLR 的语言(如 IronPython)来做这种事情,并从您的 C# 东西中调用它。

于 2008-12-23T21:05:03.010 回答