Public Structure YYY
Dim meisai1 As YYY
Dim meisai2 As YYY
.
Dim meisai99 As YYY
End Structure
Public Structure YYY
Dim abc As Int32
Dim def As String
Dim yyy As YYY
yyy.meisai1.abc = 52
↑
ここを「meisai1」~「meisai99」まで繰り返したい
動的にプロパティ名を変えたい
プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
どなたか、お教えいただけないでしょうか。
------------------------------------------------
Public Structure YYY
Dim meisai1 As YYY
Dim meisai2 As YYY
.
Dim meisai99 As YYY
End Structure
Public Structure YYY
Dim abc As Int32
Dim def As String
End Structure
------------------------------------------------
Dim yyy As YYY
yyy.meisai1.abc = 52
↑
ここを「meisai1」~「meisai99」まで繰り返したい
ラッパークラスの作成
'-------------------------------------------------------------------------------
Private Class lapXXX
Private _xx As XXX
Public Sub New(ByVal xx As XXX)
_xx = xx
End Sub
Default Public Property Items(ByVal i As Integer) As YYY
Get
Return Me.getItem(i)
End Get
Set(ByVal value As YYY)
Me.setItem(i, value)
End Set
End Property
Public ReadOnly Property Value() As XXX
Get
Return _xx
End Get
End Property
Private Function getItem(ByVal i As Integer) As YYY
Dim t As Type = _xx.GetType()
Dim fieldName As String = String.Format("meisai{0}", i)
Dim fi As System.Reflection.FieldInfo = t.GetField(fieldName)
If Not fi Is Nothing Then
Return CType(fi.GetValue(_xx), YYY)
Else
Return Nothing
End If
'Select Case i
' Case 1
' Return _xx.meisai1
' Case 2
' Return _xx.meisai2
' Case 3
' Return _xx.meisai3
' Case 4
' Return _xx.meisai4
' Case 5
' Return _xx.meisai5
' Case 6
' Return _xx.meisai6
' Case 7
' Return _xx.meisai7
' Case 8
' Return _xx.meisai8
' Case 9
' Return _xx.meisai9
' Case 10
' Return _xx.meisai10
' Case Else
' Return Nothing
'End Select
End Function
Private Sub setItem(ByVal i As Integer, ByVal value As YYY)
''VB.NETでは、なぜか構造体にSetValueメソッドが使えない。C#なら使用可能
'Dim t As Type = _xx.GetType()
'Dim fieldName As String = String.Format("meisai{0}", i)
'Dim fi As System.Reflection.FieldInfo = t.GetField(fieldName)
'If Not fi Is Nothing Then
' fi.SetValue(_xx, value)
'Else
'End If
''しかたないので、全パターンを列挙する
Select Case i
Case 1
_xx.meisai1 = value
Case 2
_xx.meisai2 = value
Case 3
_xx.meisai3 = value
Case 4
_xx.meisai4 = value
Case 5
_xx.meisai5 = value
Case 6
_xx.meisai6 = value
Case 7
_xx.meisai7 = value
Case 8
_xx.meisai8 = value
Case 9
_xx.meisai9 = value
Case 10
_xx.meisai10 = value
Case Else
End Select
End Sub
End Class
'-------------------------------------------------------------------------------
使用例
'-------------------------------------------------------------------------------
Dim x As New lapXXX(xxx) '操作しやすいようにラッパークラスに渡す
For i As Integer = 1 To 10
Dim y As YYY
y.abc = 52
y.def = x(i).def
x(i) = y
Next
xxx = x.Value 'ここ重要:操作した結果をもとにもどす
'-------------------------------------------------------------------------------
コピーが発生しまくるのであまりおすすめできません
もとがクラスになりさえすれば・・・
こんにちは、今ひとつ、意味が解らないのですが。
以下の様な使い方ですか。????
Module Module1
Public Structure yyy
Dim abc As Integer
Dim dcf As String
End Structure
Public Structure myyy
Dim meisai() As yyy
Sub ini()
ReDim meisai(99)
For i As Integer = 0 To 99
meisai(i).abc = 0
meisai(i).dcf = ""
Next
End Sub
End Structure
Sub Main()
Dim m As myyy
m.ini()
Dim i As Integer
For i = 0 To 99
m.meisai(i).abc = i * 10
m.meisai(i).dcf = "abc" & i
Next
For i = 0 To 99
Debug.Print(m.meisai(i).abc)
Debug.Print(m.meisai(i).dcf)
Next
End Sub
End Module
計算結果
0
abc0
10
abc1
20
abc2
30
abc3
40
abc4
------
中略
------
970
abc97
980
abc98
990
abc99
質問者
補足
ご回答ありがとうございます。
ご指摘のとおり、「meisai()」「List(Of YYY)」の様に指定できればいいのですが、
外部インタ-フェイスのため、「固有名のインスタンス」で、先方より指定されてしまっているので、困っております。
※質問文で、「Structure YYY」を2個書いてしまっていますが、当方の記述ミスです。
------------------------------------------------
Public Structure XXX
Dim meisai1 As YYY
Dim meisai2 As YYY
.
Dim meisai99 As YYY
End Structure
Public Structure YYY
Dim abc As Int32
Dim def As String
End Structure
------------------------------------------------
Dim xxx As XXX
xxx.meisai1.abc = 52
↑
ここを「meisai1」~「meisai99」まで繰り返したい
お礼
(1) HashTableを使用したり (2) Invokeメソッドを使用したり と、当方もいろいろやってみましたが、挫折して「Case文」にて、99個列挙して実装しました。 もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。