2012-04-15 5 views
0

Ich habe einen Typen T mit Feldern + Eigenschaften, die ich aus einem Wörterbuch füllen möchte, kann pref Groß- und KleinschreibungGibt es eine LINQ-Alternative für Schleifen in Reflexion?

ich offensichtlich

foreach(PropertyInfo pi in t.GetProperties()) 
..... 

und

foreach(FieldInfo pi in t.GetFields()) 
..... 

dann Hoffnung Es gibt einen besseren Weg, vielleicht mit LINQ?

+5

Was ist unter "..."? – abatishchev

+0

Woher kam das Wörterbuch? Ziehen Sie in Betracht, das Wörterbuch vollständig zu überspringen und Serialisierung zu verwenden. –

+0

Ich glaube, die Aufgabe besteht darin, ein Wörterbuch in eine Instanz vom Typ 'T' zu transformieren, die ihre Mitglieder aus dem Wörterbuch ausfüllt. –

Antwort

2

ist eine Option,

var propDict = t.GetProperties().ToLookup<PropertyInfo, string, Action<object, object>>(
    p => p.Name, p => (obj, val) => p.SetValue(obj, val, null)); 

var fieldDict = t.GetFields().ToLookup<FieldInfo, string, Action<object, object>>(
    f => f.Name, f => (obj, val) => f.SetValue(obj, val)); 

var memberDict = pDict.Concat(fDict).ToDictionary(p => p.Key, p => p.Value); 

... und dann etwas zu verwenden, wie ...

Dictionary<string, object> outDict; 
foreach (var keyval in outDict) 
    memberDict[keyval.Key](container, keyval.Value); 

... wenn auch nicht sicher, ob es zu viel Sinn macht, wie der Gang durch Eigenschaften/Felder ist sowieso relativ einfach, eine Idee vielleicht.

+0

Eine interessante Möglichkeit, eine Hilfsklasse zu vermeiden, um verschiedene APIs von 'PropertyInfo' und' FieldInfo' zu umbrechen. Ein bisschen monströs aber. :) –

+0

Ich habe nicht gesagt, es ist nicht "monströs" :) nur Tötung Zeit, während es kompiliert. Das OP wollte LINQ, also ist es da – NSGaga

0

Hängt davon ab, was Sie mit pi tun möchten.

  • Wenn einige neue Klasse verwandeln, dann können Sie

    t.GetProperties().Select(pi => 
    t.GetFields().Select(pi => 
    
  • Wenn das Lesen von Eigenschaften und geben sie dann foreach Schleife ist besser als LINQ.

1

Ich glaube nicht, dass es etwas besseres gibt. PropertyInfo und FieldInfo Typen haben unterschiedliche APIs zum Einstellen von Werten, daher können Sie ihre Werte nicht einheitlich ausfüllen, auch wenn Sie sie in einem IEnumerable<MemberInfo> sammeln.

Nun, Sie könnten einen Wrapper schreiben, der sowohl PropertyInfo als auch FieldInfo in einer einheitlichen Weise behandelt, die die verschiedenen APIs einkapselt. Aber 2 foreach Schleifen sind sowieso einfacher. Hier

Verwandte Themen