2011-01-27 8 views
42

Sto cercando di capire il tipo DynamicObject. Abbiamo trovato questo articolo di MSDN per essere molto conciso e chiaro come creare e utilizzare DynamicObject:Proprietà DynamicObject loop

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

L'articolo contiene una semplice classe che eredita da DynamicDictionary DynamicObject.

Ora voglio iterare su mie proprietà DynamicObject creati dinamicamente:

dynamic d = new DynamicDictionary(); 
d.Name = "Myname"; 
d.Number = 1080; 

foreach (var prop in d.GetType().GetProperties()) 
{ 
    Console.Write prop.Key; 
    Console.Write prop.Value; 
} 

Ovviamente questo non funziona. Voglio imparare come farlo senza modificare la mia classe DynamicDictionary, poiché sto davvero cercando di imparare come usarlo per tutti i tipi di oggetti esistenti che ereditano da DynamicObject.

È necessaria la riflessione? Devo mancare qualcosa ...

risposta

14

Hai provato il metodo DynamicDictionary.GetDynamicMemberNames()? - http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

+0

Sembra buono, ma non voglio/non posso cambiare la mia classe e "GetDynamicMemberNames() è una cosa opzionale, cioè una classe che eredita da DynamicObject può sovrascriverla se lo desidera, ma se non la funzione nella base viene chiamata la classe che restituisce una lista vuota. " – joeriks

+0

Hmm capisco. Quindi penso che sia necessario andare su ExpandoObject o che sia necessario implementarlo per conto proprio. – Anuraj

+0

La considero la risposta grazie – joeriks

45

Credo che ti interesserebbe la classe ExpandoObject. La classe DynamicObject è solo una base in cui si intende fornire tutta la logica. Implementa esplicitamente l'interfaccia IDictionary<string, object> in modo da poter accedere alle proprietà o aggiungerne di nuove in questo modo.

// declare the ExpandoObject 
dynamic expObj = new ExpandoObject(); 
expObj.Name = "MyName"; 
expObj.Number = 1000; 

// print the dynamically added properties 
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair 
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value); 

// cast to an IDictionary<string, object> 
IDictionary<string, object> expDict = expObj; 

// add a new property via the dictionary reference 
expDict["Foo"] = "Bar"; 

// verify it's been added on the original dynamic reference 
Console.WriteLine(expObj.Foo); 

avevo appena reso conto che si sta implementando la classe DynamicDictionary e incompreso tua domanda. Scusate.

Se utilizzato con un riferimento dinamico, si ha accesso solo ai membri esposti pubblicamente. Poiché solo lo Count è dichiarato pubblico (oltre agli altri membri DynamicObject), è necessario utilizzare la riflessione per accedere al dizionario interno per ottenere facilmente tali valori (se non si intende apportare ulteriori modifiche).

+0

Ok, grazie, quindi - per un oggetto esistente che eredita DynamicObject e non espone il dizionario - non c'è modo per me (altro che usare Reflection) per ottenere il dizionario dei membri? – joeriks

+0

AFAIK sì. Puoi accedere solo ai membri pubblici e alla classe 'DynamicObject' in cui l'accesso ai membri viene risolto tramite i vari metodi. In alternativa, è possibile implementare esplicitamente la classe 'IDictionary ' proprio come ExpandoObject per semplificare questo processo. –

+0

p.s., Scusa per prima cosa ho riflettuto sulla tua domanda. Non ho notato che stavi implementando il codice di esempio. Stavo pensando a me stesso: "Non esiste una classe' DynamicDictionary ... ":) –