あなたがどちらかを手に入れることを可能にするたくさんの反省の例がそこにそこにあります:
1.クラス内の全プロパティ
あなたが文字列名を知っていれば、単一のプロパティ
クラスとプロパティのインスタンスだけであれば、実行時にクラス内のプロパティの文字列名を取得する方法(リフレクション、TypeDescriptorなどを使用)がありますか。
編集リフレクションを使用してクラス内のすべてのプロパティを簡単に取得してから各プロパティの名前を取得できることを私は知っています。私が求めているのは、プロパティのインスタンスを渡すという条件で、プロパティの名前を私に与える関数です。つまり、class.GetType()。GetProperty(myProperty)から返されたPropertyInfo []配列から必要なプロパティを見つけて、PropertyInfo.Nameを取得できるようにするにはどうすればよいですか。
すでにお持ちの場合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"
() => myObject.AProperty
AProperty型のラムダ式int
その型は基本的に「パラメータを持たないメソッド」に変換されます。()
戻る=>
あint
(暗黙のうちに静的な型指定によって決定されます)、これはと同等です。Func<int>
。からGetPropertyName
かかりますExpression
パラメータの型は次のように変換されます。Expression<Func<int>>
代わりに。 - Jacob
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);
誰かがそれを必要とするならば...答えの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);
加えて:すべてのプロパティが付属するときnull値を持つという例外が起こる可能性があるので、彼が彼のコードを実装するとき誰かが彼の集中にこれを取らなければならない
ありがとうTKTS ..
私は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;
}