当你有一个实现了 IVehicle 的类 car 并且你想将它包装在一个装饰器中,将所有调用转发给 car 并计算它们,你会怎么做?
在 Ruby 中,我可以只构建一个没有任何方法的装饰器,并使用 method_missing 将所有调用转发给汽车对象。
在 Java 中,我可以构建一个 Proxy 对象,它通过一种方法运行所有代码,然后再转发它。
我可以在 C# 中做任何类似的事情吗?
更新:
根据回答和我读到的有关 System.Reflection.Emit 的内容,应该可以编写一个与此类似的方法:
Type proxyBuilder(Type someType, delagate functionToBeApplied, Object forward)
其中 type 实现了 someType 的所有接口(interface),执行 functionToBeApplied 然后将方法调用转发给 object,同时返回它的 return。
是否有一些库可以做到这一点,还是我必须自己编写?
最佳答案
对于代理,如果您想使用标准类型,您可以查看“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# 中实现代理或装饰器类的最短方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508110/