C# 在C中模拟IDispatchEx#
C#3.0扩展方法向基类型添加扩展,使在该类型的所有实例上调用该方法合法 现在,我知道的JavaScript实现了IDispatchEx,通过它可以向特定实例添加方法 那么,如何将一组方法添加到C#类的“实例”中呢?我知道这是一个动态与静态语言的圣战领土。:)让我澄清一下,我的意图并非如此 我只是希望能够根据实现接口的类向接口添加一组事件 我可以用泛型来做这件事C# 在C中模拟IDispatchEx#,c#,design-patterns,visitor-pattern,C#,Design Patterns,Visitor Pattern,C#3.0扩展方法向基类型添加扩展,使在该类型的所有实例上调用该方法合法 现在,我知道的JavaScript实现了IDispatchEx,通过它可以向特定实例添加方法 那么,如何将一组方法添加到C#类的“实例”中呢?我知道这是一个动态与静态语言的圣战领土。:)让我澄清一下,我的意图并非如此 我只是希望能够根据实现接口的类向接口添加一组事件 我可以用泛型来做这件事 inteface ISample<T> { T SupportedEvents; } class Sample :
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 += ...
}
}
然后我想JavaScript(我知道C#
不是JS
:)。。。还有IDispatchEx
,IL-Weaving
,Reflection.Emit
等等。我想可能有办法做到这一点。。。[设计时支持会很好,但我可以没有它]
是的,我可能可以用访问者模式进行“实例扩充”。
[不确定我是否能得到合成糖]
注释?好吧,您可以为“新”方法创建DynamicMethod实例,但是在运行时静态地将它们附加到现有实例将不起作用,因为它无法编译 您可能(我还没有尝试过)能够将操作码发送到内存中的程序集中,但这离您所能得到的“语法上的甜蜜”还有一段距离(我认为这将涉及大量反射和调用成员调用) 它也可能值得研究扩展方法——尽管我从未尝试过通过扩展方法附加事件或类似事件的方法……而且它们仅为3.5版本,因此可能会限制您 最漂亮的“纯C#”实现可能与您已经使用的通用/接口设置非常相似 老实说,如果你正在寻找像这样真正的“动态支持”,我会用支持DLR的语言(比如IronPython)来做这类事情,并从你的C#东西中调用它
new Sample().Clicked +=...