2009-08-27 91 views
0

我一直在測試VS 2010和C#4.0中的一些新東西,並且一直在推動一些事情來看它的侷限性,到目前爲止,我喜歡我所看到的,但有一件事讓我略微惱火...在C#4.0中繼承DynamicObject?

鑑於以下兩個簡單的類,是否有某種方法(除了直接調用TryGetMember)避免投射到dynamic?也許可以在Test上設置一些魔法屬性?

class DynamicPropertyObject : DynamicObject 
{ 
    private Dictionary<string, object> _properties = new Dictionary<string, object>(); 

    public override IEnumerable<string> GetDynamicMemberNames() 
    { 
     foreach (string s in _properties.Keys) 
      yield return s; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     _properties[binder.Name] = value; 
     return true; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = null; 
     if (!_properties.ContainsKey(binder.Name)) 
      return false; 

     result = _properties[binder.Name]; 
     return true; 
    } 
} 

class Test : DynamicPropertyObject 
{ 
    public Test() 
    { 
     ((dynamic)this).Foo = "test"; 
    } 
} 

回答

2

我懷疑你需要投給dynamic這樣編譯器可以將屬性訪問轉換成TryGetMember類。

編輯:

由於.NET和C#不完全動態的,也不打算始終後期綁定(除虛擬成員),有必要明確規定要動態類型,當你做。沒有中間值:一個靜態類型的對象var,當編譯器在編譯時找不到成員時,它就像動態類型一樣。

+0

是啊,你確實......想知道是否有某種方法可以告訴編譯器,這個類應該被動態地處理,因爲它顯然不是「聰明的」(我確信有足夠的理由)足以認識到DynamicObject的子類可以被視爲任何地方的動態。 – 2009-08-27 16:07:25

+0

爲什麼類子類'DynamicObject'應該突然被區別對待,沒有什麼具體原因。首先,任何階級都可以被視爲「動態的任何地方」。另一方面,將類視爲動態更改會調用語義,而且您的類可能會有一些(非動態)成員,這可能會有所不同。因此規則很簡單,並且總是需要「動態」。 – 2009-08-27 16:18:25

+0

類型爲DynamicObject(或派生類)的變量是靜態類型的變量 - 因此不能動態處理。 – 2009-08-27 16:22:17

1

沒有魔法屬性強迫一個班級總是被視爲dynamic。但是,如果你的問題具體而言,是你想爲this的類中,只需添加一個輔助屬性:

private dynamic DynThis { get { return this; } } 

,並用它來代替。

+0

具體的問題是,我希望能解決所有需要'this'部分的問題。是的,我知道它改變了調用語義,但是人們會想象(如果它沒有指向一個可靠的成員,編譯器就可以在編譯時檢查這個調用(聲明:我只知道這個實際工作的最低限度)並且該類從「DynamicObject」繼承而來,這意味着它明確支持針對它的動態調用,然後它可以發出一個運行時動態調用。 – 2009-08-27 16:22:57