处理继承自DynamicObject的子类时,如何监控非动态方法调用

3

假设我有一个继承自DynamicObject的类:

public class DynamicBase : DynamicObject
{
   public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
      //Yadda yadda yadda
    }

    //same for TrySetMember
}

然后我有一个从DynamicBase继承的子类:

public class ChildClass : DynamicBase
{
   public void SomeProperty { get; set; }
}

我希望能自动监控子类中"SomeProperty"的getter和setter。目前,由于"SomeProperty"存在于子类中,方法并没有路由到TryGet/SetMember或任何其他DynamicObject的重写方法。
理想情况下,当基类对象被实例化后,我希望出现这种行为:
var someInstance = new ChildClass();
someInstance.SomeProperty = "someValue" //Monitored somehow in DynamicBase

与创建DynamicBase实例并将子类作为类型传递(这是Moq使用DynamicProxy创建拦截器的方式)相反:

var someInstance = new DynamicBase<ChildClass>();

我在想:

  1. 使用C#是否可能实现这个功能?
  2. 如果DynamicObject是错误的基类,我应该退而使用IDynamicMetaObjectProvider或其他什么?
  3. 如果我需要采用DynamicBase的方式来创建一个代理,将ChildClass与我正在寻找的组合行为结合起来,是否可以使用类似DynamicProxy的东西来拦截调用?
1个回答

1

在4.0中添加的dynamic基础设施中不可能实现这一点。仅仅实现IDynamicMetaObjectProvider并不意味着您的类可以完全覆盖.NET的类型/成员解析。这只是意味着当一个实例在动态上下文中被引用时,那些静态无法解析的调用将会回退到动态提供程序。


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