Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中模拟IDispatchEx#_C#_Design Patterns_Visitor Pattern - Fatal编程技术网

C# 在C中模拟IDispatchEx#

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 :

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 += ...
    }  
}  
然后我想JavaScript(我知道
C#
不是
JS
:)。。。还有
IDispatchEx
IL-Weaving
Reflection.Emit
等等。我想可能有办法做到这一点。。。[设计时支持会很好,但我可以没有它]

是的,我可能可以用访问者模式进行“实例扩充”。 [不确定我是否能得到合成糖]


注释?

好吧,您可以为“新”方法创建DynamicMethod实例,但是在运行时静态地将它们附加到现有实例将不起作用,因为它无法编译

您可能(我还没有尝试过)能够将操作码发送到内存中的程序集中,但这离您所能得到的“语法上的甜蜜”还有一段距离(我认为这将涉及大量反射和调用成员调用)

它也可能值得研究扩展方法——尽管我从未尝试过通过扩展方法附加事件或类似事件的方法……而且它们仅为3.5版本,因此可能会限制您

最漂亮的“纯C#”实现可能与您已经使用的通用/接口设置非常相似

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

new Sample().Clicked +=...