2015-05-29 11 views
9

Ecco una classe derivata da DynamicDataObjectDynamicObjectDynamicObject si comporta in modo diverso per i valori 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; 
     } 
    } 

e sto consumando DynamicDataObject come qui di seguito.

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

posso vedere tutti i membri person ed è valori nella _dataDictionary ma allo stesso tempo la vista debugger esclude membri avente null valore. In modo che il membro person.Address non sia visibile nella raccolta di viste dinamiche (si veda lo screenshot qui sotto). Qualcuno può aiutarmi a capire perché DynamicObject si comporta diversamente in questo scenario?

enter image description here

risposta

3

penso che è solo un'ottimizzazione. Non serve a mantenere un riferimento al valore predefinito del tipo. Restituisce solo default(T) quando si tenta di accedervi.

E 'appena si comporta come un dizionario:

string property = "Address"; 
object val; 

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

Qual è il punto qui per mantenere Address nel dizionario? Nessuna. Questo è il motivo per cui viene rimosso.

+0

Alcuni sviluppatori di punti devono impostare intenzionalmente una proprietà null. Ciò non significa che non dovrebbe essere visualizzato nell'elenco a causa dell'ottimizzazione. Quindi lo stesso comportamento dovrebbe funzionare anche quando scriviamo LINQ. Inoltre sta mostrando membro di tipo valore se sto impostando una proprietà int con valore di default 0. Quindi la tua ipotesi è errata ad esempio: person.Age = 0 –

+0

Ho solo pensato la stessa cosa così ho provato. Sembra che controlli solo per 'null'. –