模拟IDispatchEx在C#
-
08-07-2019 - |
题
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
等等,等等,并想到的可能是有办法做到这一点... [设计时支持将是不错,但我生活中可以没有
是的,我大概可以做到这一点“例如增强”与访客模式。 [不知道如果我能得到的语法糖,虽然]
评论
解决方案
好了,你可以为你的“新”的方法创建一个DynamicMethod的实例,但静态地将它们连接到现有的实例在运行时不会因为它朴素不会编译其实工作。
您的可能的(我没有试过)能够操作码发射到一个内存组件,但这就是尽可能远离被“语法上甜”,你可以得到(将涉及大量反射的和InvokeMember调用,我想)
这也可能是值得探讨扩展方法 - 虽然我从来没有尝试连接事件或通过扩展方法事件性的方法......他们是3.5只,这样可能会限制你
在最好看,“纯C#”实现可能的东西非常相似,你已经与通用/接口设置了......
老实说,如果你正在寻找的东西与真正的“动态支撑”这样下去,我会做这种东西在DLR功能的语言(如IronPython的),然后在C#的东西叫了进去。
不隶属于 StackOverflow