winxp,vs2005(vb)です。
Private Structure Strc
Public F1 As Integer
Public F2 As Integer
Public F3 As Integer
Public F4 As Integer
Public F5 As Integer
Public F6 As Integer
End Structure
の構造体に対して
dim p as Strc
for i as integer = 1 to 6
p.F&i = "hoge" & i
next
というようなことができるのでしょうか
なにか方法を教えてもらえるとうれしいです。
リフレクションを使えばできますが,
配列にしてしまう,という簡単な解決策は採れないのですか?
>リフレクションを使えばできますが,
コードの書き方がわかりません。ネットで調べても
C+とjavaしかみつかりませんでした
えーっと,一点訂正。
>> リフレクションを使えばできますが,
VBはObject型を渡そうとするとRuntimeHelpers.GetObjectValueを挟むために,単純にはできないですね。
C#では可能なので,簡単にできるものと思っていましたが……。
まぁ,マーカーインターフェースを一個用意してImplementsするだけなので,たいした手間ではないですが,ちょっと気持ち悪いです。
> コードの書き方がわかりません。
次のどちらかの方法になります。
・System.Type.InvokeMemberメソッドを使う
・System.Type.GetFieldメソッドまたはSystem.Type.GetFieldsメソッドでSystem.Reflection.FieldInfoを取得して,System.Reflection.FieldInfo.SetValueメソッドを呼び出す
どちらにしても,Boxingのことを考えないと構造体では失敗します。
普通に考えればSystem.Object型の変数に代入して設定がすべて終わってから元に戻せばよいのですが,上記の理由からVBではその方法では失敗します。
Interface IMarkerForStructureReflection
End Interface
こんなインターフェースを用意し,Strcはこれを実装します。
次に,Strc型の変数をIMarkerForStructureReflection型の変数に代入します。
その後,SetValueではIMarkerForStructureReflection型の変数を引数に渡します。
最後に,IMarkerForStructureReflection型の変数をStrc型の変数に書き戻します。
ちなみに,自動変数は変数名から値を取得することはできないので,素直に配列を使いましょう。
今回提示いただいたコードですと、わざわざ構造体にする必要はないように思います。
Dim p(6) As String
For i As Integer = 1 To 6
p(i) = "hoge" & i.ToString
Next
でいいんではないでしょうか。
どうもむずかしいみたいですね。
配列で考えてみます。
ありがとうございました。