2009-07-17 5 views
9

Ich muß erkennen, ob ein Objekt anonym wie neu erstellt wurde {Name = Wert,}C# Detecting AnonymousType neuer {Name = Wert,} und konvertiert in Dictionary <string, object>

wenn es ein AnonymousType ist, es sollte noch hinzufügen, es ist Eigenschaften Namen/Werte in eine

Dictionary<string,object> 

Dies ist, was ich selbst zusammen gehackt:

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

ich mich gefragt, ob es eine bessere/schnellere Art und Weise des Erfassens AnonymousTypes ist, oder wenn es eine bessere/schnellere Weg ist, die Eigenschaften eines Objekts Namen/Werte in eine

Dictionary<string,object> 
+0

Was versuchen Sie damit zu erreichen? Was auch immer es ist, es muss einen besseren Weg geben, es zu tun. –

Antwort

24

Um alle Eigenschaften eines Objekts mit seinen Werten in Dictionary zu erhalten, können Sie die Leistung von Linq mit Objekten mit Reflektion verbinden.

können Sie die Enumerable.ToDictionary Methode verwenden:

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

Das werden Sie geben einen Dictionary<string, object>.

+0

Das Problem ist, wenn er nur das Wörterbuch an erster Stelle verwenden kann, wäre es enorm schneller, es sei denn, Linq macht ein verrücktes Caching bei dieser Abfrage, in welchem ​​Fall es "nur" messbar schneller wäre. –

+0

Was passiert, wenn ich "intrinsische" Eigenschaften wie "GenericEqualityComparer" sehe, anstatt Eigenschaften, die ich explizit deklariert habe? Ich habe 'GetProperties (BindingFlags.DeclaredOnly)' versucht. – drzaus

+0

seltsam, verpasste - Ich fand, dass die Methode mit dieser Reflexion (selbst in einer Objekterweiterung) sich selbst mit dem konvertierten Ergebnis aufgerufen hat, so dass meine Erweiterung auf ein Objekt UND dann auf das resultierende Wörterbuch aufgerufen wurde. – drzaus

6

Verwenden Sie die neue Kollektion Objektinitialisierer Syntax anstelle eines anonymen Typs dump:

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

eine anonyme Detecting Typ ist ein wenig hart; Nicht zuletzt kommt es auf die Sprache an! VB anon-Typen sehen nicht gleich aus wie C# anon-Typen. Ich würde Zweifel an der Logik haben, dass sich die Handlungen auf Anon-Typen unterscheiden. Sie können nach [CompilerGenerated] suchen, aber beachten Sie, dass es nicht nur "anonymer Typ" bedeutet - es gibt andere, die dies tun.

Persönlich würde ich in diesem Szenario nicht unterscheiden.

Verwandte Themen