• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:動的にプロパティ名を変えたい)

動的にプロパティ名を変えたい

このQ&Aのポイント
  • プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
  • 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」まで繰り返したい

質問者が選んだベストアンサー

  • ベストアンサー
  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.3

ラッパークラスの作成 '-------------------------------------------------------------------------------   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  'ここ重要:操作した結果をもとにもどす '------------------------------------------------------------------------------- コピーが発生しまくるのであまりおすすめできません もとがクラスになりさえすれば・・・

miho03_03
質問者

お礼

(1) HashTableを使用したり (2) Invokeメソッドを使用したり と、当方もいろいろやってみましたが、挫折して「Case文」にて、99個列挙して実装しました。 もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。

その他の回答 (2)

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.2

ちょっと気になったので、自分でも調査してみました。 リフレクションのGetFieldメソッド使えば、できると思いましたが 構造体(値型)は難しいですね・・・ クラス(参照型)なら、なんとでもなるのですが 識者に期待します

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、今ひとつ、意味が解らないのですが。 以下の様な使い方ですか。???? 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

miho03_03
質問者

補足

ご回答ありがとうございます。 ご指摘のとおり、「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」まで繰り返したい 

関連するQ&A

専門家に質問してみよう