Это определяется как:
typedef unsigned long DWORD;
Однако согласно MSDN:
На 32-разрядных платформах, долго синонимично с интервалом
Поэтому, DWORD составляет 32 бита в операционную систему на 32 бита. Существует отдельное, определяют для DWORD на 64 бита:
typdef unsigned _int64 DWORD64;
Hope, которая помогает.
Просто альтернативный ответ; если вам нужна производительность, но похожий API - рассмотрите HyperDescriptor ; здесь используется Reflection.Emit
снизу (так что вам не обязательно), но проявляется в API PropertyDescriptor
, поэтому вы можете просто использовать:
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);
Одна строка кода для включите его, и он обработает все кеширование и т. д.
Использование Reflection.Emit кажется слишком "умным", равно как и преждевременной оптимизацией. Если вы профилируете свое приложение и обнаруживаете, что отражение GetValue / SetValue является узким местом, тогда вы можете подумать об оптимизации, но, вероятно, даже не тогда ...
Используйте PropertyInfo.GetValue / SetValue
Если у вас есть проблемы с производительностью, кешируйте объект PropertyInfo (не вызывайте повторно GetProperty)
Если - и только если - используется отражение узкое место производительности вашего приложения (как видно в профилировщике) используйте Delegate.CreateDelegate
Если - и на самом деле только если - вы абсолютно уверены, что чтение / запись значений по-прежнему является худшим узким местом, пора начать изучать увлекательный мир генерации IL во время выполнения.
Я действительно сомневаюсь, что оно того стоит, каждый из этих уровней увеличивает сложность кода больше, чем повышает производительность - делайте это, только если вам нужно.
И если во время выполнения доступ к properties - ваше узкое место в производительности, вероятно, лучше использовать доступ во время компиляции (это 'Трудно быть одновременно универсальным и сверхвысоким качеством).
Если вы выбираете / устанавливаете одно и то же свойство много раз, то использование чего-то для создания типизированного метода действительно будет быстрее, чем отражение. Однако я бы предложил использовать Delegate.CreateDelegate
вместо Reflection.Emit. Это легче сделать правильно, и это по-прежнему невероятно быстро.
Я использовал это в своей реализации протокольных буферов, и это имело огромное значение по сравнению с PropertyInfo.GetValue / SetValue
. Однако, как говорили другие, делайте это только после того, как докажете, что самый простой способ слишком медленный.
У меня есть сообщение в блоге с более подробной информацией, если вы решите зайти на CreateDelegate
маршрут.
Назначение Reflection.Emit полностью отличается от цели PropertyInfo.Get / SetValue. С помощью Reflection.Emit вы можете напрямую испускать код IL, например, в динамически скомпилированные сборки, и выполнять этот код. Конечно, этот код может получить доступ к вашим свойствам.
Я серьезно сомневаюсь, что это будет намного быстрее, чем использование PropertyInfo в конечном итоге, и он также не предназначен для этой цели. Например, вы можете использовать Reflection.Emit в качестве генератора кода для небольшого компилятора.