25

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

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
4

3 に答える 3

32

他の投稿者がリフレクションを使うように言ったなんて信じられません。まさにあなたが望むことを行うCallByName関数としてのVB 。

于 2008-10-30T06:04:28.153 に答える
16

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

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

繰り返しますが、これは、パフォーマンスが重要なコードである場合にのみ必要です。それ以外の場合でも、何度もDictionary<string, PropertyInfo>呼び出すことを避けるために を作成したい場合がありますがGetProperty、それをデリゲートに変換する手順は、おそらく気にする必要はありません。

于 2008-10-27T19:33:14.387 に答える
11

はい、CallByName が最適なソリューションです。これを行う手順は次のとおりです。

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

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

于 2013-03-24T18:42:03.630 に答える