2015-05-29 13 views
9

için farklı davranır olduğunu DynamicObjectDynamicObject İşte boş değerler

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; 
     } 
    } 

türetilmiş bir DynamicDataObject sınıf ve aşağıda gibi DynamicDataObject tüketen ediyorum.

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

Ben person tüm üyelerini görebilir ve _dataDictionary değerleri var ama aynı zamanda ayıklayıcı görünümü null değeri olan üyeler hariç tutar. Böylece person.Address üyesi dinamik görünüm koleksiyonunda görünmez. (Lütfen aşağıdaki ekran görüntüsüne bakın). Bu senaryoda neden DynamicObject'un neden farklı davrandığını anlamama yardımcı olabilir misiniz?

enter image description here

cevap

3

Ben sadece bir optimizasyon olduğunu düşünüyorum. Tipin varsayılan değerine referans tutmakta hiçbir fayda yoktur. Erişmeye çalıştığınızda sadece default(T) döndürür.

string property = "Address"; 
object val; 

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

sözlükte Address tutmak için burada nokta nedir:

Sadece bir sözlük olarak davranır? Yok. Bu yüzden kaldırıldı.

+0

Bazı nokta geliştiricilerin, bir özelliği bilinçli olarak sıfırlamak zorunda bırakması gerekir. Bu, bazı optimizasyon nedeniyle listede görünmemesi gerektiği anlamına gelmez. Sonra aynı davranış LINQ da yazarken de işe yarayacak. Ayrıca, varsayılan değeri 0 olan bir int özelliği ayarlıyorsam, değer türünün bir üyesi de gösteriliyor. Yani, varsayımın yanlış olduğu mesela: person.Age = 0 –

+0

Ben de aynı şeyi düşündüm. Görünüşe göre sadece "null" kontrol ediyor. –