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

标签 c# .net reflection proxy decorator

当你有一个实现了 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/

相关文章:

c# - .NET c# - 自定义显示属性

c# - C# 中的油漆桶函数代码,运行时挂起,

c# - 如何在 WPF 应用程序的触摸屏上自然滚动列表框?

多个类的 C# 泛型方法

c# - 在 C# 中,如何从 ExpandoObject 中删除属性?

c# - .NET 中的字符串转换

c# - .NET 4.6 之前的 Buffer.MemoryCopy 替代品

c# - Fusion 日志在 "Could not load file or assembly"之后没有显示错误

java - 方法在反射中有效,但在 Java 中的 "normal way"中无效

java - 反射 - getInterfaces() 显示奇怪的接口(interface)