Я сделал несколько оглядевшихся по этому вопросу и на самом деле не смог найти много на нем. На самом деле, я уверен, что уже знаю ответ на этот вопрос, но я собираюсь спросить на всякий случай, если есть какая-то передовая техника, о которой я не знаю. (который имеет довольно высокую вероятность). Можете ли вы объявить имена свойств структуры/класса или, по крайней мере, переименовать их через какой-либо конструктор?Можете ли вы назвать свойства через конструктор Struct/Class?
В общем, длинный рассказ. Я пытаюсь создать структуру union, которая эффективно дает вам флаги стиля битполя, но дает вам возможность указывать имена флагов в объявлении, чтобы сделать код немного более чистым. Я знаю, что вы делаете то же самое в C, создавая объединение целого числа (char/double/whatever) и структуру битовых полей. То, что я мог бы сделать это в основном:
Public status as BitField({"PowerOn","Ready","Error",...})
И основная структура будет выглядеть следующим образом:
Public Structure (or Class) BitField
Private _value as UInt16
Public Property value as UInt16
Get
Return _value
End Get
Set(input as UInt16)
_value = input
End Set
End Property
Public Property bit0 As Boolean
Get
Return ((_value And &H1UI) > 0)
End Get
Set(input as Boolean)
If input Then
_value = _value Or &H1UI
Else
_value = _value And &HFFFEUI
End If
End Set
End Property
(and so on for bit 1 through 15)
Public Sub New(ByVal names() As String)
...Something that redeclairs/renames/equates "bit0" with names(0)...
...Something that redeclairs/renames/equates "bit1" with names(1)...
and so on
End Sub
End Structure/Class
И после того, что я мог бы назвать status.Error, чтобы получить или установить третий бит, но если я хотел, чтобы я мог просто сравнить status.value с маской, чтобы проверить определенное состояние.
Я имею в виду, я знаю, в C вы бы просто сделать:
union {
unsigned int value;
struct {
unsigned PowerOn:1;
unsigned Ready:1;
unsigned Error:1;
...
};
} status;
Но я хотел бы, чтобы получить тот же уровень «чистоты» в моем коде, и не должны иметь огромное заявление, что я придется копировать и переписывать каждый раз, когда я хочу его использовать.
Как я уже сказал в начале, я предполагаю, что я ухожу с базы, и нет возможности делать то, что я предлагаю в VB.Net, но если у кого-то есть какие-то мысли, я бы хотел услышать их.
Как бы код компилируется, если он знал настоящие имена свойств до времени выполнения? Вы можете использовать псевдоиндексатор и перечисление, чтобы в одном случае бит0 сопоставлялся с Foo, а в другом он отображался в Bar. Конечно, более простой подход состоял бы в том, чтобы использовать save bool, а не en/decoding bit – Plutonix
. Вы также можете использовать наследование для изменения того, что означает каждая часть, и где она сопоставляется для каждого нового использования. – Plutonix
@Plutonix. Основная причина, по которой я пытаюсь сделайте это, мне придется взаимодействовать со встроенной системой и декодировать передачи данных от нее. Многие поля - это просто байты или int, но есть несколько, которые растровые и используются для определения того, какие поля присутствуют в сообщении, а какие - пропущены. Поэтому я должен читать в байте, а затем проверять флажки, чтобы увидеть, какие поля находятся в этом сообщении. – balmerjd