在c#中实现代理或装饰器类的最短方法是什么?
发布时间:2020-12-15 04:31:32 所属栏目:百科 来源:网络整理
导读:如果你有一辆实现IVehicle的类车,并且你想将它包装在一个装饰器中,它将所有的呼叫转发给汽车并计算它们,你会怎么做? 在Ruby中,我可以在没有任何方法的情况下构建装饰器,并使用method_missing将所有调用转发给car对象. 在Java中,我可以构建一个Proxy对象,该
如果你有一辆实现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的解决方案将有更好的表现. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |