2009-07-17 13 views
9

ho bisogno di rilevare se un oggetto è stato creato in forma anonima come nuovo {nome = valore,}C# Rilevazione AnonymousType new {nome = valore,} e convertire in Dictionary <string, object>

se si tratta di un AnonymousType, dovrebbe aggiungere le sue proprietà nomi/valori in un

Dictionary<string,object> 

Questo è quello che messo insieme me stesso:

var name="name"; 

var obj = new { name = new object(), }; 

var lookup = new Dictionary<string,object>(); 


if(obj.GetType().Name.StartsWith("<>f__AnonymousType")) 
{ 
    foreach (var property in obj.GetType().GetProperties()) 
    { 
     lookup[property.Name] = property.GetValue(obj, null); 
    } 
} 
else 
{ 
    lookup[name]=obj; 
} 

mi chiedevo se c'è un/modo migliore più veloce di rilevare AnonymousTypes, o se c'è un/modo migliore più veloce per eseguire il dump proprietà nomi di un oggetto/valori in una

Dictionary<string,object> 
+0

Cosa stai cercando di realizzare con questo? Qualunque cosa sia, ci deve essere un modo migliore per farlo. –

risposta

24

Per ottenere tutte le proprietà di un oggetto, con i suoi valori in un Dictionary, è possibile accoppiare la potenza di Linq agli oggetti con Reflection.

È possibile utilizzare il metodo Enumerable.ToDictionary:

var dic = obj.GetType() 
      .GetProperties() 
      .ToDictionary(p => p.Name, p=> p.GetValue(obj, null)); 

Ciò restituirà un Dictionary<string, object>.

+0

Il problema è che se può usare il dizionario in un primo momento, sarebbe molto più veloce a meno che Linq non stia facendo un pazzo di cache su quella query, nel qual caso sarebbe "solo" misurabilmente più veloce. –

+0

Cosa succede se vedo proprietà "intrinseche" come "GenericEqualityComparer", piuttosto che proprietà che ho esplicitamente dichiarato? Ho provato 'GetProperties (BindingFlags.DeclaredOnly)'. – drzaus

+0

strano, non importa - ho scoperto che il metodo che utilizzava questo riflesso (stesso in un'estensione dell'oggetto) finiva per chiamarsi con il risultato convertito, quindi la mia estensione veniva chiamata su un oggetto E POI sul dizionario risultante. – drzaus

6

utilizzare la nuova sintassi di inizializzazione collezione oggetto invece di un tipo anonimo:

var obj = new Dictionary<string, object>() 
{ 
    { "Name", t.Name }, 
    { "Value", t.Value } 
}; 
2

Rilevamento un anonimo tipo è un piccolo difficile; non meno che dipende dalla lingua! VB anon-types non hanno lo stesso aspetto di C# anon-types. Sarei dubbioso sulla logica che agisce in modo diverso su anon-types. È possibile verificare [CompilerGenerated], ma si noti che non significa solo "tipo anonimo" - ce ne sono altri che lo fanno.

Personalmente, non vorrei distinguere in questo scenario.

Problemi correlati