Лучший способ кэширования атрибута getter/setter?
Я знаю, что Отражение может быть дорогостоящим. У меня есть класс, который часто получает/задает свойства, и один из способов, который я решил, - это как-то кэшировать отражение. Я не уверен, что я должен кэшировать выражение или что здесь делать. Это то, что я сейчас делаю:
typeof(T).GetProperty(propName).SetValue(obj, value, null);
typeof(T).GetProperty(propName).GetValue(obj, null);
Итак... каким будет лучший способ сделать это быстрее?
Ответы
Ответ 1
Вам следует кэшировать результаты
typeof(T).GetProperty(propName);
и
typeof(T).GetProperty(propName);
Другим возможным подходом является объединение PropertyInfo.GetGetMethod Method (или PropertyInfo.GetSetMethod Method для setter) с Delegate.CreateDelegate Method и вызвать получателя делегата каждый раз, когда вам нужно получить/установить значения. Если вам нужно это для работы с дженериками, вы можете использовать подход из этого вопроса: CreateDelegate с неизвестными типами
Это должно быть намного быстрее по сравнению с отражением:
Выполнение размышлений и поиск делегатов
Существуют и другие способы получения/установки значений более быстрым способом. Вы можете использовать деревья выражений или DynamicMethod для генерации il во время выполнения. Посмотрите на эти ссылки:
Поздние привязки с DynamicMethod
Delegate.CreateDelegate vs DynamicMethod vs Expression
Ответ 2
Ну, самый простой ответ: вы можете кэшировать объект PropertyInfo
, возвращенный GetProperty
:
var propInfo = typeof(T).GetProperty(propName);
propInfo.SetValue(obj, value, null);
propInfo.GetValue(obj, null);
// etc.
Это устранит необходимость в Reflection для многократного поиска свойства в классе и устранения основной части производительности.
Ответ 3
Марк Гравелл написал блестящую статью о своем HyperDescriptor.
Он должен обеспечивать гораздо более быстрый доступ к свойствам отражающей способности во время выполнения.
Ответ 4
Просто сохраните ссылку на PropertyInfo
, которая возвращается:
typeof(T).GetProperty(propName)