Отражение. Испустите лучше, чем GetValue & SetValue: S

Это определяется как:

typedef unsigned long       DWORD;

Однако согласно MSDN:

На 32-разрядных платформах, долго синонимично с интервалом

Поэтому, DWORD составляет 32 бита в операционную систему на 32 бита. Существует отдельное, определяют для DWORD на 64 бита:

typdef unsigned _int64 DWORD64;

Hope, которая помогает.

16
задан Omu 26 November 2009 в 15:31
поделиться

5 ответов

Просто альтернативный ответ; если вам нужна производительность, но похожий API - рассмотрите HyperDescriptor ; здесь используется Reflection.Emit снизу (так что вам не обязательно), но проявляется в API PropertyDescriptor , поэтому вы можете просто использовать:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

Одна строка кода для включите его, и он обработает все кеширование и т. д.

26
ответ дан 30 November 2019 в 15:18
поделиться

Использование Reflection.Emit кажется слишком "умным", равно как и преждевременной оптимизацией. Если вы профилируете свое приложение и обнаруживаете, что отражение GetValue / SetValue является узким местом, тогда вы можете подумать об оптимизации, но, вероятно, даже не тогда ...

1
ответ дан 30 November 2019 в 15:18
поделиться

Используйте PropertyInfo.GetValue / SetValue

Если у вас есть проблемы с производительностью, кешируйте объект PropertyInfo (не вызывайте повторно GetProperty)

Если - и только если - используется отражение узкое место производительности вашего приложения (как видно в профилировщике) используйте Delegate.CreateDelegate

Если - и на самом деле только если - вы абсолютно уверены, что чтение / запись значений по-прежнему является худшим узким местом, пора начать изучать увлекательный мир генерации IL во время выполнения.

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

И если во время выполнения доступ к properties - ваше узкое место в производительности, вероятно, лучше использовать доступ во время компиляции (это 'Трудно быть одновременно универсальным и сверхвысоким качеством).

11
ответ дан 30 November 2019 в 15:18
поделиться

Если вы выбираете / устанавливаете одно и то же свойство много раз, то использование чего-то для создания типизированного метода действительно будет быстрее, чем отражение. Однако я бы предложил использовать Delegate.CreateDelegate вместо Reflection.Emit. Это легче сделать правильно, и это по-прежнему невероятно быстро.

Я использовал это в своей реализации протокольных буферов, и это имело огромное значение по сравнению с PropertyInfo.GetValue / SetValue . Однако, как говорили другие, делайте это только после того, как докажете, что самый простой способ слишком медленный.

У меня есть сообщение в блоге с более подробной информацией, если вы решите зайти на CreateDelegate маршрут.

22
ответ дан 30 November 2019 в 15:18
поделиться

Назначение Reflection.Emit полностью отличается от цели PropertyInfo.Get / SetValue. С помощью Reflection.Emit вы можете напрямую испускать код IL, например, в динамически скомпилированные сборки, и выполнять этот код. Конечно, этот код может получить доступ к вашим свойствам.

Я серьезно сомневаюсь, что это будет намного быстрее, чем использование PropertyInfo в конечном итоге, и он также не предназначен для этой цели. Например, вы можете использовать Reflection.Emit в качестве генератора кода для небольшого компилятора.

1
ответ дан 30 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: