我正在尝试将动态代理作为现有库的包装器,目标是通过动态调度处理现有对象的所有操作(属性访问、成员访问、方法调用……)。对于横切关注点,我可能需要它,例如更好的错误处理、日志记录或此对象的访问控制。
我想出了dynamic
为实现接口的现有对象创建一个包装器
IDynamicMetaObjectProvider
,但是Expressions
通过实现我自己的来解析所有对象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
虚拟方法的概述吗?