2016-07-12 4 views
0

У меня есть структура данных, в которой есть 29 булевых типов данных. Есть ли способ выполнить итерацию через свойства Struct в цикле For без явно выражающего каждое имя свойства в стандартном синтаксисе свойств.Есть ли способ перебора свойств структуры?

Это то, с чего я начал, но это не сработает.

Public Structure ST_PLCStruct_Bools 
    Public testTypeNS As Boolean    '1 byte 
    Public testTypeOR As Boolean    '1 byte 
    Public torqueTypeBreak As Boolean   '1 byte 
    Public torqueTypeFix As Boolean    '1 byte 
    Public sheaveHigh As Boolean    '1 byte 
    Public sheaveLow As Boolean     '1 byte 
    Public directionCW As Boolean    '1 byte 
    Public directionCCW As Boolean    '1 byte 
    Public cycleStart As Boolean    '1 byte 
    Public cycleStarted As Boolean    '1 byte 
    Public cycleStop As Boolean     '1 byte 
    Public cycleStopped As Boolean    '1 byte 
    Public pneuActuateAuto As Boolean   '1 byte 
    Public pneuActuateMan As Boolean   '1 byte 
End Structure 

Private plcData_Bools As ST_PLCStruct_Bools 

For i = 0 To 28 
    plcData_Bools(i) = binaryReader.ReadBoolean 
Next 

Спасибо.

+0

Вы имеете в виду, как у коллекция? – Plutonix

+0

Как выглядит код вашей структуры данных (нам нужен только образец свойств)? Похоже, что вы можете использовать отражение для установки значений свойств, но я не могу сказать по вашему вопросу. – Mark

+0

Было бы неплохо использовать в качестве коллекции, но я не знаю, как это сделать, и я не знаком с отражением или как это работает. Спасибо за помощь. – busarider29

ответ

1

Используя отражение, вы можете использовать FieldInfo.SetValue для установки значений без кодирования имени каждого поля. Используя структуру по сравнению с классом усложняет a little из-за бокса типов значений:

Private plcData_Bools As ST_PLCStruct_Bools 

Dim boxed As ValueType = plcData_Bools 
For Each f In GetType(ST_PLCStruct_Bools).GetFields() 
    f.SetValue(boxed, binaryReader.ReadBoolean()) 
Next 
plcData_Bools = DirectCast(boxed, ST_PLCStruct_Bools) 
+0

Мне нужно использовать структуру для получения/установки переменных в/из проекта ПЛК. Может быть, есть еще один способ сделать это через класс (?), Но я просто следую тому, что показано в онлайн-документации Beckhoff Infosys. Во всяком случае, похоже, что использование отражения будет работать. Спасибо за помощь! – busarider29

0

В 32-битном режиме Boolean выровнен по 4 байта

Imports System.Runtime.InteropServices 

Public Structure Bools 
    Public b1, b2, b3, b4, b5 As Boolean 
End Structure 

Sub Main() 
    Dim bools = New Bools With {.b2 = True, .b4 = True} ' {False, True, False, True, False} 
    Dim size = Marshal.SizeOf(bools) ' 20 
    Dim intArray%(size \ 4 - 1) 'As Integer ' { 0, 0, 0, 0, 0 } 

    Dim Ptr = Marshal.AllocHGlobal(size) 
    Marshal.StructureToPtr(bools, Ptr, False) 
    Marshal.Copy(Ptr, intArray, 0, size \ 4) ' { 0, 1, 0, 1, 0 } 
    Marshal.FreeHGlobal(Ptr) 
End Sub 

Источник http://www.codeproject.com/Articles/8967/Marshaling-Structures

Смежные вопросы