![]() |
1
2
这可能不值得回答,但您没有看到.NET中动态代理激增的原因之一是,大多数常见的.NET语言(C#,VB.NET)与Java在一个非常重要的方面不同: 在Java中,除非显式声明密封,否则所有方法都是虚拟的。 在C#(和VB.NET IIRC)中,除非显式声明为虚拟,否则所有方法和属性都是密封的。
请注意,“默认密封”行为是.NET的一项功能 语言 -很有可能,我们可以设计一种基于.NET的语言,它具有与Java相同的“默认虚拟”行为。虽然我什么都不知道,但如果没有这样一种语言,我会感到惊讶。毕竟,这一切都在编译器中。 |
![]() |
2
1
“我还感到惊讶的是,.Net框架本身没有这种功能。” 有。虽然不完整、不优雅或不完美。 您可以使用创建从RealProxy继承的通用代理,并可能接收要代理的对象。要获取代理,您需要从realproxy获取一个transparentproxy,并将其转换为您的wrapee(这是一个单词吗?)类型。现在你有了一个代理。代理上的所有方法都可以在RealProxy中的重写调用(IMessage msg)中处理。将它们按原样传递给您的真实对象(wrapee),或者在它们之间执行任何其他操作。 Cavets:要代理的对象必须从MarshalByRef继承。它相当慢。我不会将其用于常用功能。这就是这里所有的远程处理基础设施。在大多数情况下,ILgen是更好的方法,但在某些情况下,我不得不使用上述方法。 |