gpt4 book ai didi

c# - 使用动态/DLR 的 DynamicProxy

转载 作者:行者123 更新时间:2023-11-30 15:01:45 25 4
gpt4 key购买 nike

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

我想到了为实现的现有对象创建一个动态包装器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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com