41

あなたがどちらかを手に入れることを可能にするたくさんの反省の例がそこにそこにあります:

    1.クラス内の全プロパティ

    あなたが文字列名を知っていれば、単一のプロパティ

クラスとプロパティのインスタンスだけであれば、実行時にクラス内のプロパティの文字列名を取得する方法(リフレクション、TypeDescriptorなどを使用)がありますか。

編集リフレクションを使用してクラス内のすべてのプロパティを簡単に取得してから各プロパティの名前を取得できることを私は知っています。私が求めているのは、プロパティのインスタンスを渡すという条件で、プロパティの名前を私に与える関数です。つまり、class.GetType()。GetProperty(myProperty)から返されたPropertyInfo []配列から必要なプロパティを見つけて、PropertyInfo.Nameを取得できるようにするにはどうすればよいですか。


  • あなたは、プロパティのgetter / setter内のプロパティの名前を取得するという意味ですか? 「持っている」とはどういう意味ですか。プロパティ? - Jacob
  • @Jacob - わかりやすくするために、文字列名を取得したい(getter / setterではなく)プロパティ(および他のプロパティ)を持つクラスのインスタンスを持っています。 Reflectionを使用してそのプロパティに何らかの作業を行う必要がありますが、プロパティ名をリファクタリングする場合には、ハードコードされた文字列名を使用してコードを管理したくないです。したがって、私はプログラムでプロパティの名前を取得したいです。 - Joel B
  • 名前ではないにしても、他にどのようにして欲しいプロパティを識別できますか? - jnylen
  • プロパティからプロパティ名を取得する方法については私のアップデートを参照してください。表現。 - Jacob
  • の可能な重複ラムダ式を使用してプロパティの名前と型を取得する - nawfal

7 답변


83

すでにお持ちの場合PropertyInfoそれなら@ dtbの答えが正しいです。ただし、現在どのプロパティのコードを使用しているのかを知りたい場合は、現在の呼び出しスタックを調べて、現在実行しているメソッドを調べ、そこからプロパティ名を取得する必要があります。

var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
var thisFrame = frames[0];
var method = thisFrame.GetMethod();
var methodName = method.Name; // Should be get_* or set_*
var propertyName = method.Name.Substring(4);

編集する

あなたの説明の後、私はあなたがしたいのはプロパティからプロパティの名前を取得することであるかどうか疑問に思います表現。もしそうなら、あなたはこのようなメソッドを書きたくなるでしょう:

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
    return (propertyExpression.Body as MemberExpression).Member.Name;
}

それを使うためには、次のように書きます。

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty"


  • Expressionを使用する場合は+1。このように質問を理解できませんでした。 - Ondrej Tucny
  • 式は+1です。私はそれでDead Crazyを入手したばかりです。多くのおかげで、ねえ...(ところで、あなたが私にc#の構文を少し説明することができれば、これはかなり高度なものに聞こえます、私は本当にそれをすべて得るわけではなかったことを認めなければなりません。チャーム) - Mehdi LAMRANI
  • 構文は少し奇妙です。式の構文は、ラムダ式の構文とまったく同じです。どちらであるかは、呼び出されるメソッド内のパラメータの種類によって異なります。もし() => myObject.APropertyAProperty型のラムダ式intその型は基本的に「パラメータを持たないメソッド」に変換されます。()戻る=>int(暗黙のうちに静的な型指定によって決定されます)、これはと同等です。Func<int>。からGetPropertyNameかかりますExpressionパラメータの型は次のように変換されます。Expression<Func<int>>代わりに。 - Jacob
  • 良い解決をありがとう。私の質問はそれです:私はこれを拡張メソッドでmyObject.AProperty.GetPropertyName()のように実装することができますか? - masoud ramezani

44

C#6.0(Visual Studio 2015)では、次のものを使用できます。nameof演算子、これのように:

var obj = new MyObject();
string propertyName = nameof(obj.Property);
string methodName = nameof(obj.Method);
string directPropertyName = nameof(MyObject.Property);
string directMethodName = nameof(MyObject.Method);


  • これは本当に素晴らしい方法です。 - Gandalf458
  • OP、まだそこにいない場合は、承認された回答を選択し直すことをお勧めします。 - William T. Mallard

5

誰かがそれを必要とするならば...答えのVB .NETバージョンはここにあります:

Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String
   Return TryCast(PropertyExp.Body, MemberExpression).Member.Name
End Function

使用法:

Dim name As String = GetPropertyName(Function() (New myObject).AProperty)


  • TKTSありがとう、あなたの答えは素晴らしいです、そしてこれはこの構文のC#コードですpublic static string GetPropertyName< t>(Expression< Func< t>> PropertyExp){return(PropertyExp.Body as MemberExpression).Member.Name; string name = GetPropertyName(()=>(new Tasks())。Title); - Ahmad Hindash

3

正確にはTKTSによって書かれた正しい答えです。ここで私は彼の構文をC#に変換したいだけです。

public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp)
{
return (PropertyExp.Body as MemberExpression).Member.Name;
}

そしてこのコードの使い方は以下の例のようになります。

string name = GetPropertyName(() => (new Tasks()).Title);

加えて:すべてのプロパティが付属するときnull値を持つという例外が起こる可能性があるので、彼が彼のコードを実装するとき誰かが彼の集中にこれを取らなければならない

ありがとうTKTS ..


0

myClassInstance.GetType().GetProperties()あなたにあげるPropertyInfoのすべてのパブリックプロパティのインスタンスmyClassInstanceのタイプ(見るMSDN「PropertyInfo.Name」は、プロパティの実際の名前です。あなたがすでに財産の名前を知っている場合GetProperty(name)取得するPropertyInfoオブジェクト(参照MSDN再び)。


0

私はJacobによって提供されたバージョンを使いました、しかし時々それは例外を与えました。キャストが無効だったからです。このバージョンは問題を解決しました:

    public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression)
    {
        ConstantExpression cExpr = propertyExpression.Body as ConstantExpression;
        MemberExpression mExpr = propertyExpression.Body as MemberExpression;

        if (cExpr != null)
            return cExpr.Value.ToString();
        else if (mExpr != null)
            return mExpr.Member.Name;

        else return null;
    }

リンクされた質問


関連する質問

最近の質問