установка приватных свойств классов

У меня есть очень старый код, который использует отражение для установки свойств объектов, например, что-то вроде этого:

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

Я думал о замене этого кода, чтобы сделать его быстрее. Но поскольку приведенный выше код также позволяет устанавливать частные свойства объекта, я не уверен, что существуют другие варианты.

Вопросы:

  1. Правильно ли я понимаю, что скомпилированные выражения (с использованием System.Linq.Expressions) и сгенерированный код (с использованием CodeDom/Microsoft.CSharp.CSharpCodeProvider) нельзя использовать для установки частных свойств?
  2. Возможно ли это с помощью Reflection.Emit?
  3. Будет ли какая-либо из библиотек сопоставления (AutoMapper, ValueInjecter) помочь в этом (я не знаю, какую технологию они используют внутри компании)?
  4. Есть ли другие варианты?

person M4N    schedule 04.03.2011    source источник


Ответы (1)


Платформа с открытым исходным кодом Impromptu-Interface имеет статический метод InvokeSet, использующий DLR, а не отражение. , и он будет вызывать частные методы. Он работает чуть более чем в 2 раза быстрее, чем отражение в тестовом примере с единичной скоростью, который похож на ваш.

using ImpromptuInterface;

...

foreach(var property in properties){
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]);
}
person jbtule    schedule 08.03.2011
comment
Спасибо, посмотрю. - person M4N; 08.03.2011