web-dev-qa-db-ja.com

VB.NETを使用して文字列名でプロパティを動的に呼び出す

私は現在、コードのセクションが次のようになっているプロジェクトに取り組んでいます。

Select Case oReader.Name
    Case "NameExample1"
        Me.Elements.NameExample1.Value = oReader.ReadString
    ....
    Case "NameExampleN"
        Me.Elements.NameExampleN.Value = oReader.ReadString
    ....
End Select

それはしばらく続きます。コードは明らかに冗長であり、感じ改善できるようです。次のようなことができるように、VB.NETでプロパティを動的に呼び出す方法はありますか?

Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
26
Tom

他の人は完全に合理的に答えましたが、これがパフォーマンスに敏感なコードである場合に備えて、リフレクティブ呼び出しをデリゲートにコンパイルすることをお勧めします。

ブログエントリMethodBase.Invoke をデリゲートに変換する方法があります。コードはC#ですが、同じ手法をVB.NETにも適用できます。これをプロパティで使用するには、 PropertyInfo.GetSetMethod を使用して適切な「セッター」メソッドを取得し、それを呼び出すデリゲートを作成します。フィールド名から「フィールドを設定するために呼び出すために委任する」へのマップを持つことができます。

繰り返しになりますが、これは、パフォーマンスが重要なコードに含まれている場合にのみ本当に必要です。それ以外の場合は、GetPropertyを何度も呼び出さないようにDictionary<string, PropertyInfo>を作成することもできますが、デリゲートに変換する手順はおそらく心配する価値がありません。

16
Jon Skeet

他のポスターがリフレクションを使うように言ったなんて信じられません。 VB as CallByName あなたが望むことを正確に実行する関数。

31
Jonathan Allen

はい、CallByNameはあなたにとって最良の解決策です。これを行う手順は次のとおりです。

CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)

「NameExample1」の代わりに「NameExample」と書くことができます。
その3番目のパラメーターを使用すると、そのパラメーターを「取得」、「許可」できます(さらに、任意のメソッドを呼び出すこともできます)。
したがって、CallType.Getを使用してパラメーターの値を取得できます。

11
Jet