Лучший способ кешировать свойства отражения getter / setter? - PullRequest
13 голосов
/ 03 ноября 2011

Я знаю, что Reflection может быть дорогим.У меня есть класс, который часто получает / устанавливает свойства, и я решил, что каким-то образом кешировать отражение.Я не уверен, должен ли я кэшировать выражение или что здесь делать на самом деле.Это то, чем я сейчас занимаюсь:

typeof(T).GetProperty(propName).SetValue(obj, value, null);
typeof(T).GetProperty(propName).GetValue(obj, null);

Итак ... как лучше всего это сделать быстрее?

Ответы [ 4 ]

11 голосов
/ 03 ноября 2011

Вы должны кешировать результаты

typeof(T).GetProperty(propName); 

и

typeof(T).GetProperty(propName);

Другой возможный подход - объединить метод PropertyInfo.GetGetMethod (или метод PropertyInfo.GetSetMethod для установщика) с методом Delegate.CreateDelegate и вызвать полученный делегат каждый раз, когда вам нужно получить / установить значения. Если вам нужно это для работы с дженериками, вы можете использовать подход из этого вопроса: CreateDelegate с неизвестными типами

Это должно быть намного быстрее по сравнению с отражением: Размышление и исследование делегатов

Существуют и другие способы получения / установки значений более быстрым способом. Вы можете использовать деревья выражений или DynamicMethod для генерации il во время выполнения. Посмотрите эти ссылки:

Вызовы с поздним связыванием с DynamicMethod

Delegate.CreateDelegate vs DynamicMethod vs Expression

4 голосов
/ 03 ноября 2011

Ну, самый простой ответ: вы можете кэшировать объект PropertyInfo, возвращаемый GetProperty:

var propInfo = typeof(T).GetProperty(propName);
propInfo.SetValue(obj, value, null);
propInfo.GetValue(obj, null);

// etc.

Это исключило бы необходимость для Reflection повторно находить свойство в классе и устраняло бы большую часть попадания в производительность.

3 голосов
/ 03 ноября 2011

Марк Гравелл написал блестящую статью о своем HyperDescriptor .Это должно обеспечить намного более быстрый доступ к отражающим свойствам во время выполнения.

2 голосов
/ 03 ноября 2011

Просто сохраните ссылку на PropertyInfo, возвращаемую из:

typeof(T).GetProperty(propName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...