LDo*_*ala 7 .net c# reflection proxy decorator
如果你有一辆实现IVehicle的类车,并且你想将它包装在一个装饰器中,它将所有的呼叫转发给汽车并计算它们,你会怎么做?
在Ruby中,我可以在没有任何方法的情况下构建装饰器,并使用method_missing将所有调用转发给car对象.
在Java中,我可以构建一个Proxy对象,该对象通过一种方法运行所有代码,然后再转发它.
在C#中我能做些类似的事吗?
更新:
基于answeres和我读过的关于System.Reflection.Emit的内容,应该可以编写一个类似于此的方法:
Type proxyBuilder(Type someType, delagate functionToBeApplied, Object forward)
Run Code Online (Sandbox Code Playgroud)
其中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);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以从 Castle 获取“DynamicProxy”。根据我的经验,它的效果更好一些。
如果您使用其中一个,您不一定会获得出色的性能,但我主要在首先可能会很慢的呼叫中使用它们。但是如果您愿意,您可以尝试一下。
Marc的解决方案会有更好的性能。
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |