- ベストアンサー
動的にプロパティ名を変えたい
- プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
- 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」まで繰り返したい
- みんなの回答 (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 'ここ重要:操作した結果をもとにもどす '------------------------------------------------------------------------------- コピーが発生しまくるのであまりおすすめできません もとがクラスになりさえすれば・・・
その他の回答 (2)
- AlexSuns
- ベストアンサー率67% (78/115)
ちょっと気になったので、自分でも調査してみました。 リフレクションのGetFieldメソッド使えば、できると思いましたが 構造体(値型)は難しいですね・・・ クラス(参照型)なら、なんとでもなるのですが 識者に期待します
- tom11
- ベストアンサー率53% (134/251)
こんにちは、今ひとつ、意味が解らないのですが。 以下の様な使い方ですか。???? 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個列挙して実装しました。 もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。