Я пишу классы как «более высокого уровня» представления некоторых двоичных структур как двоичные файлы, tcp-пакеты и т. Д.Определить атрибуты как данные времени компиляции?
Для этого и для удобства чтения это было бы очень приятно, если бы я может определить некоторый пользовательский атрибут, чтобы определить некоторую информацию о поле каждого класса (например, смещение этого поля в двоичном буфере, размер поля и т. д.).
Я мог бы это сделать, объявив постоянные целые числа, но ИМХО код был бы очень уродливым и грязным. Поэтому я подумал об использовании атрибутов, которые являются очень элегантным способом выполнить то, что я хочу. Такие функции, как InteropServices.Marshal, фактически используют атрибуты (как StructLayout, MarshalAs и FieldOffset) для достижения чего-то очень похожего на то, что я хочу, поэтому я могу только предположить, что компромисс между производительностью выгоден по сравнению с приростом удобочитаемости (пожалуйста, исправьте меня, неверно).
Итак, как обработанные атрибуты InteropServices обрабатываются компилятором/CLR?
Вы, ребята, считаете, что этот недостаток стоит? Если да, лучший способ справиться с атрибутами - использовать метод по умолчанию с помощью Refletion? Я предполагаю, что могут быть другие способы доступа к атрибутам, а не к Reflection, потому что я знаю, что это немного дорого, и Маршал использует его почти по каждому методу.
Любая полезная мысль была бы очень признательна, спасибо.
Здравствуйте, Майк, благодарю вас за ответ. Знаете ли вы, что методы маршала касаются атрибутов? Мне немного любопытно, что хе-хе. – ptr0x
Nope. Атрибуты структуры и компоновки являются особыми, и clr знает, что они имеют в виду макет памяти определенным образом. Для всех деталей gore это хорошая ссылка: https://www.simple-talk.com/dotnet/.net-framework/5-tips-for-understanding-managed-unmanaged-interoperability-in-.net/ –
Большое спасибо! :) – ptr0x