在c#中实现代理或装饰器类的最短方法是什么?

在c#中实现代理或装饰器类的最短方法是什么?,第1张

概述如果你有一辆实现IVehicle的类车,并且你想将它包装在一个装饰器中,它将所有的呼叫转发给汽车并计算它们,你会怎么做? 在Ruby中,我可以在没有任何方法的情况下构建装饰器,并使用method_missing将所有调用转发给car对象. 在Java中,我可以构建一个Proxy对象,该对象通过一个方法运行所有代码,然后转发它. 在C#中我能做些类似的事吗? 更新: 基于answeres和我读过的关 如果你有一辆实现IVehicle的类车,并且你想将它包装在一个装饰器中,它将所有的呼叫转发给汽车并计算它们,你会怎么做?

在Ruby中,我可以在没有任何方法的情况下构建装饰器,并使用method_missing将所有调用转发给car对象.

在Java中,我可以构建一个Proxy对象,该对象通过一个方法运行所有代码,然后转发它.

在C#中我能做些类似的事吗?

更新:

基于answeres和我读过的关于System.Reflection.Emit的内容,应该可以编写一个与此类似的方法:

Type proxyBuilder(Type someType,delagate functionToBeApplIEd,Object forward)

其中type实现someType的所有接口,执行functionToBeApplIEd,然后在返回其返回时将方法调用转发给object.

是否有一些lib可以做到这一点,还是我必须自己编写?

解决方法 对于代理,你可以查看“RealProxy”,如果你想使用标准类型,虽然使用它有点麻烦(它需要你的类继承MarshalByRefObject).
public class TestProxy<T> : RealProxy where T : class{    public T Instance { get { return (T)GettransparentProxy(); } }    private Readonly MarshalByRefObject refObject;    private Readonly string uri;    public TestProxy() : base(typeof(T))    {        refObject = (MarshalByRefObject)Activator.CreateInstance(typeof(T));        var objRef = RemotingServices.Marshal(refObject);        uri = objRef.URI;    }    // You can find more info on what can be done in here off MSDN.    public overrIDe IMessage Invoke(IMessage message)    {        Console.Writeline("Invoke!");        message.PropertIEs["__Uri"] = uri;        return ChannelServices.SyncdispatchMessage(message);    }}

或者你也可以从Castle获得“DynamicProxy”..在我的经验中它的效果更好一点..

如果你使用其中一个,你不会有必要获得很好的性能,我主要使用它们可能在一开始可能会很慢的调用..但你可以试试看,如果你想.

marc的解决方案将有更好的表现.

总结

以上是内存溢出为你收集整理的在c#中实现代理或装饰器类的最短方法是什么?全部内容,希望文章能够帮你解决在c#中实现代理或装饰器类的最短方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263672.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存