3

我正在尝试将动态代理作为现有库的包装器,目标是通过动态调度处理现有对象的所有操作(属性访问、成员访问、方法调用……)。对于横切关注点,我可能需要它,例如更好的错误处理、日志记录或此对象的访问控制。

我想出了dynamic为实现接口的现有对象创建一个包装器 IDynamicMetaObjectProvider,但是Expressions通过实现我自己的来解析所有对象DynamicMetaObject似乎很麻烦!

另一种解决方案是从DynamicObject类继承来为我做繁重的工作,但同样有十几个虚拟方法,我不知道如何重写!我想我只知道TrySetMember,TryGetMemberTryInvokeMember 方法做什么或如何实现它们,但是还有很多其他方法我不知道如何使用!

public class DynamicProxy : DynamicObject
{
    private object Value;

    public DynamicProxy(object value)
    {
        this.Value = value;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = null;      // get proxy object value using reflection
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        // set proxy object value using reflection
        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        result = null;      // call proxy object method using reflection
        return true;
    }

    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
        return base.TryInvoke(binder, args, out result);
    }

    public override bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes)
    {
        // What to do here?
    }

    public override bool TryDeleteMember(DeleteMemberBinder binder)
    {
        // What to do here?
    }

    public override bool TryUnaryOperation(UnaryOperationBinder binder, out object result)
    {
        // What to do here?
    }

    // ... Other virtual methods of DynamicObject
}

DynamicObject所以我的问题是:有没有完全覆盖或至少完全实现IDynamicMetaObjectProvider接口的开源库?有人可以指出DynamicObject虚拟方法的概述吗?

4

2 回答 2

4

您不必重写 的所有方法DynamicObject,在大多数情况TryGetMemberTrySetMember就足够了。DynamicObject所有方法都有默认实现,你可以只实现你想改变的方法

DynamicObject是一个实现的类IDynamicMetaObjectProvider,因此如果您的包装器不需要任何其他基类,请使用它

实现IDynamicMetaObjectProvider会有点无聊,但如果你决定这样做,看看它是如何DynamicObjectILSpy实现的

于 2012-11-28T09:48:13.260 回答
1

我有一个开源框架 ImpromptuInterface(在 nuget 中),它有一个抽象类ImpromptuForwarder,它是一个DynamicObject 子类,它的基本实现只是使用 dlr 将属性、方法和事件以及索引器的调用转发到目标。

它还有很多其他有趣的 dlr 代理,包括静态接口类型到动态实现curring 方法后期绑定类型静态方法代理

于 2012-11-29T18:25:34.727 回答