c# - 如何在C#中制作一个简单的动态代理

标签 c# .net reflection proxy aop

我想构建一个动态代理对象来为对象添加某些功能。

基本上我想接收一个对象,用一个看起来与我得到的原始对象相同的对象包装它,并拦截所有调用。

class Wrapper : DynamicProxy// dynamic proxy is not a reall class, but i guess something like this exists...
{
    public static T Wrap(T obj)
    {
        return (T) new Wrapper(obj);
    }

    public override object InterceptCall(MethodInfo info, object[] args)
    {
        // do stuff
    }

}

澄清一下,我想做一些类似于 WCF channel 工厂的事情......


我正在添加赏金,因为我需要一个很好的方法来代理类(而不是接口(interface))和处理非虚拟方法(就像我在“new”关键字下继承并添加了一个方法一样)。 我确信这一切都是很有可能的,因为 .Net 做到了。

最佳答案

您可以使用 DynamicObject 的组合来做到这一点和 ImpromptuInterface但是您必须有一个接口(interface)来实现您要代理的功能和属性。

public interface IDoStuff
{
    void Foo();
}

public class Wrapper<T> : DynamicObject
{
    private readonly T _wrappedObject;

    public static T1 Wrap<T1>(T obj) where T1 : class
    {
        if (!typeof(T1).IsInterface)
            throw new ArgumentException("T1 must be an Interface");

        return new Wrapper<T>(obj).ActLike<T1>();
    }

    //you can make the contructor private so you are forced to use the Wrap method.
    private Wrapper(T obj)
    {
        _wrappedObject = obj;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        try
        {
            //do stuff here

            //call _wrappedObject object
            result = _wrappedObject.GetType().GetMethod(binder.Name).Invoke(_wrappedObject, args);
            return true;
        }
        catch
        {
            result = null;
            return false;
        }
    }
}

您当然可以选择失去类型安全并使用 DynamicObject ,就像我展示的那样,然后放弃 duck-casting。

我制作了这个对象代理的透明可扩展版本,并将其开源 here .

关于c# - 如何在C#中制作一个简单的动态代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387004/

相关文章:

c# - 使用带有 DataAnnotations 的可移植类库共享程序集

.net - 在 vs 中调试时的本地化

Java 静态初始化器和反射

reflection - 如何将 clojure 的 doc 函数应用于一系列函数

c# - 请求静态内容时 Nancy 单元测试不起作用

c# - C# new 语句后的大括号有什么作用?

c# - 在 DataGridView 上托管自定义控件,这些控件从 DataTable 填充数据

java - 为什么反射找不到带有 boolean 参数的方法?

c# - 在asp.net中将图片url转换为图片bye

c# - WCF 是我的正确选择吗?