プロが教える店舗&オフィスのセキュリティ対策術

プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
どなたか、お教えいただけないでしょうか。
------------------------------------------------
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」まで繰り返したい

A 回答 (3件)

こんにちは、今ひとつ、意味が解らないのですが。


以下の様な使い方ですか。????

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」まで繰り返したい 

補足日時:2009/09/10 19:12
    • good
    • 0

ちょっと気になったので、自分でも調査してみました。


リフレクションのGetFieldメソッド使えば、できると思いましたが
構造体(値型)は難しいですね・・・
クラス(参照型)なら、なんとでもなるのですが

識者に期待します
    • good
    • 0

ラッパークラスの作成


'-------------------------------------------------------------------------------
  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  'ここ重要:操作した結果をもとにもどす
'-------------------------------------------------------------------------------

コピーが発生しまくるのであまりおすすめできません
もとがクラスになりさえすれば・・・
    • good
    • 0
この回答へのお礼

(1) HashTableを使用したり
(2) Invokeメソッドを使用したり
と、当方もいろいろやってみましたが、挫折して「Case文」にて、99個列挙して実装しました。

もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。

お礼日時:2009/09/11 17:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!