2015-05-29 80 views
9

這裏是DynamicObjectDynamicObject表現不同null值

public class DynamicDataObject : DynamicObject 
{ 
     private readonly Dictionary<string, object> _dataDictionary = new Dictionary<string, object>(); 

     public override bool TryGetMember(GetMemberBinder binder, out object result) 
     { 
      return _dataDictionary.TryGetValue(binder.Name, out result); 
     } 

     public override bool TrySetMember(SetMemberBinder binder, object value) 
     { 
      if (!_dataDictionary.ContainsKey(binder.Name)) 
      { 
       _dataDictionary.Add(binder.Name, value); 
       return true; 
      } 

      return false; 
     } 

     public override IEnumerable<string> GetDynamicMemberNames() 
     { 
      return _dataDictionary.Keys; 
     } 
    } 

派生的DynamicDataObject類,我消費DynamicDataObject像下面。

public MainWindow() 
{ 
    InitializeComponent(); 
    dynamic person = new DynamicDataObject(); 
    person.FirstName = "Vimal"; 
    person.LastName = "Adams"; 
    person.Address = null; 
} 

我可以看到person所有成員和它在_dataDictionary值,但在同一時間調試視圖不包括具有null值的成員。因此person.Address成員在動態視圖集合中不可見(請參見下面的截圖)。任何人都可以請幫我理解爲什麼DynamicObject在這種情況下行爲有所不同?

enter image description here

回答

3

我覺得這只是一個優化。保持對該類型的默認值的引用沒有用處。當您嘗試訪問它時,它僅返回default(T)

它只是表現爲詞典:

string property = "Address"; 
object val; 

if (!dic.TryGetValue(property, out val)) 
{ 
    return default(T); 
} 
else 
{ 
    return (T)val; // simplification 
} 

什麼是這裏保持Address在字典中的點?沒有。這就是爲什麼它被刪除。

+0

有些點開發人員必須有意將屬性設置爲空。這並不意味着它不應該出現在列表中,因爲有一些優化。然後,當我們編寫LINQ時,同樣的行爲也應該起作用。此外,它顯示值類型的成員,如果我設置默認值爲0的int屬性。所以你的假設是錯誤的,例如:person.Age = 0 –

+0

我只是認爲相同,所以我測試它。它似乎只是檢查'null'。 –