DOBON.NET DOBON.NETプログラミング掲示板過去ログ

変数の指定を文字列で行うことは可能か?

環境/言語:[Windows2k, XP VB.NET]
分類:[.NET]

下記のコードみたく、コーディング内で使用している変数名を、外部(ex;環境変数、Textファイル)から指定して利用することはどのようにすれば可能でしょうか?
説明がうまくなくてすみません。

Private Gaibu as string
Private ReadPath as string = "C:\Windows"

Sub Main
Gaibu = "ReadPath" <-このへんをうまくしたい
Data(Gaibu)
end Sub

Sub Data(ByVal Path As String) As Boolean
TextBox.Text = Path '<- このときに、"ReadPath"でなく"C:\Windows"としたい
End Sub
こちらのサイトにある Tips のリフレクションの項を読みましょう。
■No19268に返信(じゃんぬねっとさんの記事)
> こちらのサイトにある Tips のリフレクションの項を読みましょう。

じゃんぬねっとさん、いままで「リフレクション」について、いろいろ
試してみましたが、私には理解できませんでした。
なにかヒントだけでもいただけませんでしょうか?

Dim Gaibu as string
Dim ReadPath as string = "C:\Windows"

Gaibu = "ReadPath"

Dim path As String
Dim sType As Type = gaibu.GetType()

path = CStr(sType.InvokeMember("ToString", Reflection.BindingFlags., Nothing, sType, Nothing))

こんな感じで進めるのでしょうか?
たぶんReadPathフィールドの値を取得したいということですね?そうであれば、

型のメンバを動的に呼び出す
http://dobon.net/vb/dotnet/programing/typeinvokemember.html

のコードの内、フィールドの値を取得する部分を参考にしてください。
■No19273に返信(管理人さんの記事)
> たぶんReadPathフィールドの値を取得したいということですね?そうであれば、
> 
> 型のメンバを動的に呼び出す
> http://dobon.net/vb/dotnet/programing/typeinvokemember.html
> 
> のコードの内、フィールドの値を取得する部分を参考にしてください。

管理人様
お返事ありがとうございます。教えていただいたページを参考にしてみたのですが、
値が取得できませんでした。やはり、私のレベルでは理解と展開ができませんでした。
インスタンスを作成した時点で、値がNothingになってしまいます。
どうかヒントをお願いいたします。

Public Class MyClass
  Private gaibu As String
  Private ReadPath As String = "C:\Windows"
  <その他いっぱい>

  Private Sub Button3_Click(*****) Handles Button3.Click
        gaibu = "ReadPath"
        Dim path As String
        Dim sType As Type = GetType(MyClass)
        Dim target As Object = sType.InvokeMember(Nothing, _
                                Reflection.BindingFlags.CreateInstance, _
                                Nothing, _
                                Nothing, _
                                New Object() {})
        path = CStr(sType.InvokeMember("gaibu", _
                    Reflection.BindingFlags.Public Or  Reflection.BindingFlags.NonPublic Or _
                    Reflection.BindingFlags.Instance Or Reflection.BindingFlags.GetField, _
                    Nothing, _
                    target, _
                    Nothing))
    End Sub
End Class
最終的に取得したいのは、"C:\Windows"なんですよね?
> path = CStr(sType.InvokeMember("gaibu", _

"gaibu"ではなく、gaibuでは?
■No19280に返信(よねKENさんの記事)
> 最終的に取得したいのは、"C:\Windows"なんですよね?
>> path = CStr(sType.InvokeMember("gaibu", _
>
> "gaibu"ではなく、gaibuでは?
>
>

よねKENさま
ほんとうにありがとうございます!昨日からずーっと悩んでいたことが
すっきりいたしました。ほんとうに助かりました!

じゃんぬねっとさん、管理人さんも
大変おせわになりました!
解決済み!
2007/03/09(Fri) 14:53:59 編集(投稿者)

こんにちは〜
もるがんさんの記事を興味深く読ませていただきました。
変数をこのように[検索?]できるとは!すごいです
VB2005で試したら、以下のように簡素化できました
gaibu = "ReadPath"
Dim path As String
path = GetType(Form1).InvokeMember(gaibu, _
BindingFlags.NonPublic _
Or BindingFlags.Instance _
Or BindingFlags.GetField, _
Nothing, _
Me, _
Nothing)
解決済み!
2007/03/09(Fri) 16:04:43 編集(投稿者)
2007/03/09(Fri) 16:04:38 編集(投稿者)
<pre><pre>■No19283に返信(y4yamaさんの記事)
> 2007/03/09(Fri) 14:53:59 編集(投稿者)
>
> こんにちは〜
> もるがんさんの記事を興味深く読ませていただきました。
> 変数をこのように[検索?]できるとは!すごいです
> VB2005で試したら、以下のように簡素化できました
> gaibu = "ReadPath"
> Dim path As String
> path = GetType(Form1).InvokeMember(gaibu, _
> BindingFlags.NonPublic _
> Or BindingFlags.Instance _
> Or BindingFlags.GetField, _
> Nothing, _
> Me, _
> Nothing)

y4yamaさん
ありがとうございます!VS2003でも教えていただいた事で
動作いたしました!本当にありがとうございました!

私の行いたかった事は、アプリ利用者に変数の値を決めさせるのではなく、
処理中に決定される(可変な)変数を指定させたかったのです。
だから利用者は変数を選ぶというより、なにか固定値を選択させられているような
イメージです。。わかってもらえるかなぁ。。。他に利用価値のあると思われる方
の参考になれば之幸いです。
#BindingFlags.StaticもOrすれば、固定値も取得できましたぁ。




> </pre></pre>
解決済み!
■No19285に返信(もるがんさんの記事)
> #BindingFlags.StaticもOrすれば、固定値も取得できましたぁ。

固定値ではなく、静的フィールドですね。
ちなみに、私は InvokeMember メソッドより GetField メソッドの方が好きです。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板