Подтвердить что ты не робот

Лучший способ кэширования атрибута getter/setter?

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

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

Итак... каким будет лучший способ сделать это быстрее?

4b9b3361

Ответ 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)