1

プロパティにアクセスするためにオブジェクトを実際にインスタンス化せずに、プロパティ名にアクセスするための「タイプセーフ」な方法が必要な要件があります。例を挙げると、IMyObjectのリストと、プロパティ名(IMyObjectに存在するプロパティ)を表す文字列を引数として取るメソッドについて考えてみます。

メソッドの実装はリストを取得し、渡されたプロパティ名を使用してリスト内のすべてのオブジェクトにアクセスします...何らかの理由で、私たちはそれにこだわるつもりはありません!!

これで、インスタンス化されたオブジェクトを使用してこれを実行できることがわかりました...

Dim x as MyObject = nothing
Dim prop As PropertyInfo = PropHelper.GetProperty(Of MyObject)(Function() x.MyProperty)

私のヘルパーメソッドがリフレクションを使用してプロパティの名前を文字列として取得する場合、これがWeb上を飛び回る例は数多くあります。

しかし、私はこの無意味なオブジェクトを作成する必要はありません。MyObject.MyPropertyのようなことをしたいだけです!リフレクションを使用すると、その型のオブジェクトを宣言せずに型のプロパティとメソッドを反復処理できます...しかし、特定のプロパティにアクセスして、反復せずに、その型のオブジェクトを宣言せずに、その名前の文字列バージョンを取得したいと思います。

ここでの主なポイントは、プロパティ名を文字列として取得しようとしていますが...これは実行時に行われます...コンパイル時に、これをタイプセーフにしたいので、誰かがプロパティ名を変更した場合、コンパイルが壊れます。

誰かがこのクエストを手伝ってくれる?!?!

4

3 に答える 3

5

そこで、私が探していた答えを示す簡単なコード リストを次に示します。

Imports System.Linq.Expressions

Public Class A
    Public Prop1 As String
    Public Prop2 As Integer
End Class

Public Class Form1
    Public Function GetPropertyNameB(Of TModel, TProperty)(ByVal [property] As Expression(Of Func(Of TModel, TProperty))) As String
        Dim memberExpression As MemberExpression = DirectCast([property].Body, MemberExpression)
        Return memberExpression.Member.Name
    End Function

    Public Sub New()
        InitializeComponent()
        Dim propertyName As String = GetPropertyNameB(Function(myObj As A) myObj.Prop1)
        Dim propertyName2 As String = GetPropertyNameB(Function(myObj As A) myObj.Prop2)
        MsgBox(propertyName & " | " & propertyName2)
        End
    End Sub
End Class
于 2012-05-16T11:28:56.583 に答える
0

プロパティを単純な lamdba 式として渡し、メソッドで式ツリーとして取得できる場合があります。式ツリーを分析してプロパティの文字列名を取得できるはずですが、プロパティ名が変更された場合、ラムダ式はコンパイルに失敗します。詳細については、このページをご覧ください。

http://msdn.microsoft.com/en-us/library/bb397951.aspx

于 2012-05-15T20:05:08.160 に答える