2013-04-02 61 views
0

我創建了一個簡單的類,它是DynamicObject的後代:「‘對象’不包含‘財產’,沒有擴展方法‘財產’接受型‘對象’的第一個參數的定義可以發現」

public class DynamicCsv : DynamicObject 
{ 

    private Dictionary<string, int> _fieldIndex; 
    private string[] _RowValues; 

    internal DynamicCsv(string[] values, Dictionary<string, int> fieldIndex) 
    { 
     _RowValues = values; 
     _fieldIndex = fieldIndex; 
    } 

    internal DynamicCsv(string currentRow, Dictionary<string, int> fieldIndex) 
    { 
     _RowValues = currentRow.Split(','); 
     _fieldIndex = fieldIndex; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = null; 
     dynamic fieldName = binder.Name.ToUpperInvariant(); 
     if (_fieldIndex.ContainsKey(fieldName)) 
     { 
      result = _RowValues[_fieldIndex[fieldName]]; 
      return true; 
     } 
     return false; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dynamic fieldName = binder.Name.ToUpperInvariant(); 
     if (_fieldIndex.ContainsKey(fieldName)) 
     { 
      _RowValues[_fieldIndex[fieldName]] = value.ToString(); 
      return true; 
     } 
     return false; 
    } 

} 

我做使用後代對象以下內容:

protected string[] _currentLine; 
    protected Dictionary<string, int> _fieldNames; 
... 
       _fieldNames = new Dictionary<string, int>(); 
... 
       _CurrentRow = new DynamicCsv(_currentLine, _fieldNames); 

當我嘗試使用_CurrentRow用點符號:

int x = _CurrentRow.PersonId; 

我得到以下錯誤消息:

「‘對象‘不包含關於’屬性‘和沒有擴展方法’屬性’接受型‘對象’的第一個參數可以定義找到」

我可以用VB沒有任何問題,雖然解決該房產在即時窗口:

? _CurrentRow.PersonId 
+0

也許這只是我..但我就是不能看到你聲明'PersonId' ..是它的屬性?公共變量? .. 在哪兒?你如何聲明'_CurrentRow'? –

回答

3

它看起來像_CurrentRow鍵入爲object但您希望在其上進行動態查找。如果是這樣的話,那麼你需要的類型更改爲dynamic

dynamic _CurrentRow; 
+0

是的,它在我看來就像是將它創建爲「對象」類型。請注意,在C#中,多態性是顯式的,所以即使您定義了DynamicCsv,如果給定的類型是「對象」,那麼它將只允許在不投射的情況下考慮「對象」中的字段,方法和屬性。如前所述,您需要將其命名爲dynamic,在調用PersonId之前將其轉換爲正確的類型,或者更好的是使用靜態類型。一般來說,如果您可以避免使用動態輸入,那麼請執行,因爲如果您不小心,可能會導致鍵入問題。 – Hoeloe

+0

就是這樣!一個小字使所有的區別,謝謝。 – BermudaLamb

1

你不顯示的_CurrentRow聲明。它應以具有動態行爲被宣佈爲

dynamic _CurrentRow

相關問題