0

私は次のモデルを持っています:

Public Class MyModel

    Public Property MyModelId As Integer
    Public Property Description As String
    Public Property AnotherProperty As String

End Class

以下のコードのようにモデルのプロパティ名を文字列表現で取得する方法はありますか?

Dim propertyName as String = GetPropertyNameAsStringMethod(MyModel.Description)

したがって、propertyName 変数の値は「説明」です。

4

5 に答える 5

2

この SO スレッドの Darin Dimitrov の回答を確認してください - Reflection - get property name

class Foo
{
    public string Bar { get; set; }
}

class Program
{
    static void Main()
    {
        var result = Get<Foo, string>(x => x.Bar);
        Console.WriteLine(result);
    }

    static string Get<T, TResult>(Expression<Func<T, TResult>> expression)
    {
        var me = expression.Body as MemberExpression;
        if (me != null)
        {
            return me.Member.Name;
        }
        return null;
    }
}

この助けを願っています..

于 2013-01-04T14:52:19.793 に答える
1

リフレクションを使用してそれを行う必要があります。

次のようなスタックオーバーフローに関する投稿がすでにたくさんあります。

リフレクションを介して現在のプロパティ名を取得するには?

リフレクション - プロパティ名を取得

リフレクションを使用してプロパティの文字列名を取得する

リフレクション - プロパティ名を取得

答えは次のようになると思います。

 string prop = "name"; 
 PropertyInfo pi = myObject.GetType().GetProperty(prop);
于 2013-01-04T14:53:00.340 に答える
1

以下は、任意のプロパティに使用できるヘルパー拡張メソッドです。

public static class ReflectionExtensions
{
    public static string PropertyName<T>(this T owner, 
        Expression<Func<T, object>> expression) where T : class
    {
        if (owner == null) throw new ArgumentNullException("owner");
        var memberExpression = (MemberExpression)expression.Body;
        return memberExpression.Member.Name;
    }

}

ただし、これはクラスのインスタンスでのみ機能します。代わりに、型を直接操作する同様の拡張メソッドを作成できます。

于 2013-01-04T14:51:25.667 に答える
0

拡張メソッドを作成し、必要に応じて使用します。

Private Shared Function GetPropertyName(Of T)(exp As Expression(Of Func(Of T))) As String
    Return (DirectCast(exp.Body, MemberExpression).Member).Name
End Function

この投稿も見てください。

于 2013-01-04T14:54:42.977 に答える
0

@NiranjanKalaのソースの例を少し編集して、この問題を解決しました。

このようにvb.Netのコードを変換する

<System.Runtime.CompilerServices.Extension()> _
Public Function GetPropertyName(Of T, TResult)(expression As Expression(Of Func(Of T, TResult))) As String
    Dim [me] = TryCast(expression.Body, MemberExpression)
    If [me] IsNot Nothing Then
        Return [me].Member.Name
    End If
    Return Nothing
End Function

次に、このように拡張機能を呼び出すことができます

Dim propertyName as String = GetPropertyName(Of MyModel, String)(Function(x) x.Description)

次に、propertyName 変数には、文字列値として「説明」があります。

于 2013-01-04T15:15:46.637 に答える