2010-08-29 47 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的類型/成員分辨率。這只是意味着,當動態上下文中引用實例時,如果調用不能解決,否則靜態將回退到動態提供程序。