変数を変数で処理したい

解決


ジェームス木工ボンド  2008-01-12 00:04:22  No: 144281  IP: 192.*.*.*

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
というようなことができるのでしょうか
なにか方法を教えてもらえるとうれしいです。

編集 削除
YuO  2008-01-12 13:54:29  No: 144282  IP: 192.*.*.*

リフレクションを使えばできますが,
配列にしてしまう,という簡単な解決策は採れないのですか?

編集 削除
ジェームス木工ボンド  2008-01-12 19:38:03  No: 144283  IP: 192.*.*.*

>リフレクションを使えばできますが,
コードの書き方がわかりません。ネットで調べても
C+とjavaしかみつかりませんでした

編集 削除
YuO  2008-01-14 04:12:20  No: 144284  IP: 192.*.*.*

えーっと,一点訂正。
>> リフレクションを使えばできますが,
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型の変数に書き戻します。


ちなみに,自動変数は変数名から値を取得することはできないので,素直に配列を使いましょう。

編集 削除
さるべーじ  URL  2008-01-15 16:59:19  No: 144285  IP: 192.*.*.*

今回提示いただいたコードですと、わざわざ構造体にする必要はないように思います。

Dim p(6) As String
For i As Integer = 1 To 6
    p(i) = "hoge" & i.ToString
Next

でいいんではないでしょうか。

編集 削除
ジェームス木工ボンド  2008-01-22 12:06:12  No: 144286  IP: 192.*.*.*

どうもむずかしいみたいですね。
配列で考えてみます。
ありがとうございました。

編集 削除