2010-08-29 39 views
3

假设我有一个继承自DynamicObject的类:在处理从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; } 
} 

我想监视getter和setter子类中的“SomeProperty”自动生成。目前,由于子项中存在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

对于4.0中添加的dynamic基础结构,这是不可能的。简单地实现IDynamicMetaObjectProvider并不意味着你的类会完全否决.NET的类型/成员分辨率。这只是意味着,当动态上下文中引用实例时,如果调用不能解决,否则静态将回退到动态提供程序。