установка приватных свойств классов - PullRequest
3 голосов
/ 04 марта 2011

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

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. Есть ли другие варианты?

1 Ответ

1 голос
/ 08 марта 2011

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

using ImpromptuInterface;

...

foreach(var property in properties){
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...