2015-05-29 9 views
9

के लिए अलग तरह से व्यवहार करती है यहाँ एक DynamicDataObject वर्ग से DynamicObjectDynamicObject शून्य मान

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 नीचे की तरह लेने वाली हूँ।

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 के साथ एक इंट प्रॉपर्टी सेट कर रहा हूं। तो आपकी धारणा गलत है जैसे: person.Age = 0 –

+0

मैंने बस यही सोचा ताकि मैं इसका परीक्षण कर सकूं। ऐसा लगता है कि यह सिर्फ 'शून्य' के लिए जाँच करता है। –

संबंधित मुद्दे