c# шпаргалка Улучшение отражения производительности, какие альтернативы мне следует учитывать




регулярные выражения. 3-е изд. (5)

Мне нужно динамически устанавливать значения на связке или свойствах объекта, называть его объектом передачи. Будет довольно много таких объектов передачи, которые будут созданы и будут установлены в течение короткого промежутка времени. Я хочу избежать использования рефлексии, есть ли альтернатива? Если бы были примеры реализации, на которые я мог смотреть?

благодаря


В .NET 4.0 (бета) вы можете сделать это с помощью обновленных деревьев выражений, используя Expression.Block и Expression.Assign - затем скомпилируйте это для типизированного делегата; Работа выполнена.

В .NET 2.0 и выше (как упоминал Джон) HyperDescriptor является разумным вариантом - он работает как пользовательская реализация PropertyDescriptor , поэтому вы просто делаете код как:

// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
    typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);

У этого все еще есть небольшой бокс, но это не является узким местом.



Отражение получило плохую репутацию от Java, где она (или, по крайней мере, используется) была очень медленной. Это не относится к .net, поэтому я не понимаю вашего возражения по его использованию. Также я согласен с Рексом, вы не можете сказать, что что-то имеет низкую производительность без фактического измерения.


Используйте Delegate.CreateDelegate чтобы превратить MethodInfo в строго типизированный делегат. Это может значительно повысить производительность. У меня есть сообщение в блоге об этом с образцом кода. Обратите внимание, что это поможет вам только в том случае, если вам нужно установить одни и те же свойства несколько раз - в основном это означает, что при проверке проверки типов выполняется один раз при создании делегата, а не при каждом вызове.

Марк Гравелл имеет проект HyperPropertyDescriptor, который обеспечивает еще лучшую производительность, но вводит дополнительную зависимость. Этот проект стал отправной точкой для более современного Fast Member ( github ). В общем, вы бы использовали Fast Member над HyperProperty.


Отражение может быть невероятно быстрым, если вы делаете это правильно (конечно, не так быстро, как статический код).

Поиск установки свойств медленный. Вызов делегата выполняется быстро.

Вам нужно получить и кешировать объекты Delegate для каждого установщика свойств для каждого типа DTO. Это медленная часть, но это одноразовый удар. Затем вы можете Invoke каждого из кэшированных делегатов для свойств-свойств заданного типа DTO, передавая объект DTO и новое значение свойства, но эта часть будет очень быстрой.







reflection