2015-02-06 83 views
0

我有一個自定義的動態對象,它在內部只是一個字典,但允許訪問它的值,就好像它們是編譯時間屬性一樣。動態對象調用方法成員訪問TryGetMember

它(或多或少)只是這樣的:

public class Dummy : DynamicObject, IEnumerable<KeyValuePair<string, object>> 
{ 
    private readonly Dictionary<string, object> _values... 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = _values[binder.Name]; 
     return true; 
    } 
    ... 

設置和獲取「屬性」優良工程,但因爲我的目標在技術上實現了IEnumerable<'1>,我想呼籲從IEnumerable<'1>方法。

但是,每當我打電話給Count()TryGetMember被調用這當然是沒有意義的:

The key 'Count()' was not present in the dictionary. 

有沒有辦法來解決這個問題?

+0

我無法複製您的問題。你能告訴你如何調用Count()嗎? – 2015-02-06 16:32:51

+0

此外,'Count'不是'IEnumerable'上的方法 - 它是一個_extension方法,編譯器將其轉換爲對靜態方法「Enumerable.Count」的調用。 – 2015-02-06 16:33:48

回答

0

簡單地說,你不能使用擴展方法使用正常語法的動態對象。你可以使用Enumerable.Count(dummyInstance);,但我懷疑這是你想要的。

詳情請參閱[Extension method and dynamic object

+0

我不太確定,如果我正確理解這一點。我一直認爲擴展方法只是語法上的糖,它可以轉化爲一個靜態方法調用,並且調用成員作爲第一個參數?所以list.Count()在編譯後變成Enumerator.Count(list),所以這不應該與實例是動態的,還是對象,或其他什麼有關? – xvdiff 2015-02-06 17:25:45

+0

是的,確切地說,它是句法糖。這意味着它在編譯時完成。看起來編譯器應該知道你正在實例化一個Dummy類,因此應該在編譯期間把這個動態對象看作一個IEnumerable對象,但實際上並沒有這樣做,因此它不知道要調用哪個靜態方法。那有意義嗎? – Jessica 2015-02-06 17:44:20