
プロパティに値をセットする際、動的にプロパティ名を変えてセットしたいのですが、どの様にすれば可能かがわかりません。
どなたか、お教えいただけないでしょうか。
------------------------------------------------
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」まで繰り返したい
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 'ここ重要:操作した結果をもとにもどす
'-------------------------------------------------------------------------------
コピーが発生しまくるのであまりおすすめできません
もとがクラスになりさえすれば・・・
(1) HashTableを使用したり
(2) Invokeメソッドを使用したり
と、当方もいろいろやってみましたが、挫折して「Case文」にて、99個列挙して実装しました。
もっとスマ-トな方法があれば、お教えいただければ、ありがたいです。
No.2
- 回答日時:
ちょっと気になったので、自分でも調査してみました。
リフレクションのGetFieldメソッド使えば、できると思いましたが
構造体(値型)は難しいですね・・・
クラス(参照型)なら、なんとでもなるのですが
識者に期待します
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
この回答への補足
ご回答ありがとうございます。
ご指摘のとおり、「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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA セルの値がおかしいです
-
VBA セル間のリンク修正につい...
-
エクエルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
-
vbsでのwebフォームへの入力制限?
-
ダブルクリックで貼り付けた画...
-
vba textboxへの入力について教...
-
【マクロ】並び替えの範囲が、...
-
【マクロ】開いているブックの...
-
えくせるのVBAコードについて教...
-
Excelのマクロについて教えてく...
-
VBAでセルの書式を変えずに文字...
-
複数のExcelファイルをマージす...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
VBAの「To」という語句について
-
VBAでFOR NEXT分を Application...
-
VB.net 文字列から日付型へ変更...
-
【ExcelVBA】5万行以上のデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のメンバをfor文で回したい
-
mailto:の本文に文字数制限はあ...
-
batファイルでtelnetを起動⇒文...
-
mailto:の中に&を入れる
-
UWSCで出目画像カウントしたい
-
R8Cマイコンの乗算
-
動的にプロパティ名を変えたい
-
携帯の良番を持ってると思いま...
-
携帯・PCアクセス振り分け IP...
-
Wi-Fiが繋がらなくなりました N...
-
USB3.2 GEN2×2のケーブルにThun...
-
outlookのアドレス帳について
-
逆引き権限委譲とは?
-
Windows端末でのsyslog受信につ...
-
パケットの計算方法について
-
アクセスで有給休暇管理表を作...
-
MACアドレスで逮捕できる?
-
C言語でTCPの3way handshake
-
PINGに応答するメリット,デメリ...
-
ネットワーク構成に関する質問...
おすすめ情報