c# - 使用动态/DLR 的 DynamicProxy

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

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

我想到了为实现的现有对象创建一个动态包装器 IDynamicMetaObjectProvider 接口(interface),但是通过解析所有的 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 接口(interface)?有人可以指出 概述了 DynamicObject 虚方法?

最佳答案

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

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

实现 IDynamicMetaObjectProvider 会有点无聊,但是如果您决定这样做,请查看它是如何在 DynamicObject 中使用 ILSpy 实现的

关于c# - 使用动态/DLR 的 DynamicProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13602102/

相关文章:

c# - 不确定如何解决 'Unable to determine the principal end of an association' 错误

c# - 我们可以使用 C# 在 FTP 服务器中解压缩文件吗

dynamic - Angular2 - 从模块动态加载组件

C# - 如何为多级继承层次结构指定泛型类型约束?

c# - 发布数据时维护 ViewBag 值

c# - Dynamic Chart Shows no data MSCHART,只出现白色图表

c# - 使用泛型在类之间进行转换

c# - SQL CROSS JOIN问题

mysql - 如何在 MySQL 中存储 Coldfusion #variable# 并从数据库输出变量值(而不是变量名称)?

javascript - Json Ajax 和 Javascript