2011-03-04 4 views
3

j'ai un code très ancien qui utilise la réflexion pour définir les propriétés des objets, par exemple quelque chose comme ceci:définition des propriétés privées des classes

var properties = obj.GetType().GetProperties(
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
foreach (var property in properties) 
{ 
    property.SetValue(obj, lookup[property.Name]); 
} 

Je pensais à remplacer ce code pour le rendre plus rapide. Mais parce que le code ci-dessus permet également de définir les propriétés privées d'un objet, je ne suis pas sûr quelles autres options existent.

Questions:

  1. Ai-je raison, que les expressions compilées (en utilisant System.Linq.Expressions) et le code généré (en utilisant CodeDom/Microsoft.CSharp.CSharpCodeProvider) ne peuvent pas être utilisés pour définir les propriétés privées?
  2. Serait-ce possible en utilisant Reflection.Emit?
  3. Est-ce que l'une des bibliothèques de cartographie (AutoMapper, ValueInjecter) aiderait à cela (je ne sais pas quelle technologie ils utilisent en interne)?
  4. Existe-t-il d'autres options?

Répondre

1

Le framework open source Impromptu-Interface a une méthode statique InvokeSet utilise le DLR plutôt que la réflexion, et il appellera des méthodes privées. Il fonctionne un peu plus de deux fois plus vite que le reflet dans le cas de test de la vitesse unitaire, qui ressemble à la vôtre.

using ImpromptuInterface; 

...

foreach(var property in properties){ 
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]); 
} 
+0

Merci, je vais avoir un coup d'oeil. – M4N

Questions connexes