DynamicProxy使用动态/ DLR

时间:2012-11-28 09:44:26

标签: c# .net dynamic dynamic-language-runtime

我正在尝试将动态代理作为现有库的包装器,目标是 使用a处理所有操作(属性访问,成员访问,方法调用......) 现有对象通过动态调度。对于贯穿各领域的关注,我可能需要这样做, 比如对这个对象更好的错误处理,记录或访问控制。

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

另一个解决方案是从DynamicObject类继承来进行繁重的工作 我,但又有十几个虚拟方法,我不知道如何 重写!我想我只知道TrySetMemberTryGetMemberTryInvokeMember 方法做或如何实现它们,但还有很多其他方法我不知道 怎么用!

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 个答案:

答案 0 :(得分:3)

在大多数情况下,您不必覆盖DynamicObject的所有方法,只需TryGetMemberTrySetMember即可。 DynamicObject具有所有方法的默认实现,您只能实现要更改的方法

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

实施IDynamicMetaObjectProvider会有点无聊,但如果您决定这样做,请查看DynamicObject如何ILSpy

实施该方法

答案 1 :(得分:1)

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

它还有许多其他有趣的dlr代理内容,包括static interface typing to dynamic implementationscurring methodslate bound type static method proxy