使用动态/DLR的动态代理

3
我正在尝试制作一个动态代理,作为现有库的包装器,目标是通过动态调度处理所有操作(属性访问、成员访问、方法调用等)与现有对象。我可能需要这个功能来处理横切关注点,例如更好的错误处理、日志记录或对该对象的访问控制。
我想到了创建一个实现IDynamicMetaObjectProvider接口的现有对象的dynamic包装器,然而通过实现自己的DynamicMetaObject来解析所有表达式似乎很麻烦!
另一个解决方案是从DynamicObject类继承以为我完成繁重的工作,但是又有很多虚拟方法,我不知道如何准确地重写它们!我猜我只知道TrySetMember、TryGetMember和TryInvokeMember方法的作用或如何实现它们,但还有许多其他方法我不知道如何使用!
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虚方法的概述吗?

2个回答

4
您不必覆盖DynamicObject的所有方法,只需在大多数情况下覆盖TryGetMemberTrySetMember即可。 DynamicObject对所有方法都有默认实现,您只需实现要更改的方法即可。 DynamicObject是一个实现IDynamicMetaObjectProvider的类,因此如果您的包装器不需要任何其他基类,请使用它。
实现IDynamicMetaObjectProvider可能会有点枯燥乏味,但是如果您决定这样做,请查看如何使用ILSpyDynamicObject中实现它。

方法调用怎么样?索引器呢?构造函数呢? - Kamyar Nazeri
DynamicObject默认实现了所有方法,只需要重写你需要的方法。 - Arsen Mkrtchyan
代理对象实际上是已经在现有程序集中定义的POCO对象,因此我无法更改它们的基类。我将检查ILSpy以查看如何实现“DynamicObject”。这都是由于MSDN中“DynamicObject”和“IDynamicMetaObjectProvider”的文档不足所致。 - Kamyar Nazeri

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接