C#6より前にC#に相当するものについて話しているのであれば、これでプロパティの処理が(ハックな方法で)行われます。おそらくフィールド、メソッドなどを含めるために拡張できます。
public static class TestExtension
{
public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
{
if (propertyAccessor.Body.NodeType == ExpressionType.MemberAccess)
{
var memberExpression = propertyAccessor.Body as MemberExpression;
if (memberExpression == null)
return null;
return memberExpression.Member.Name;
}
return null;
}
}
これをすぐに完成させたので、改善すべきことはたくさんありますが、次のように使用します。
public class myClass
{
public string myProp { get; set; }
}
var a = new myClass();
var result = a.nameof(b => b.myProp);
結果に「myProp」が含まれる
更新:
より包括的な(それでもまだそれほどきれいではありませんが)
public static class TestExtension
{
public static String nameof<T, TT>(this Expression<Func<T, TT>> accessor)
{
return nameof(accessor.Body);
}
public static String nameof<T>(this Expression<Func<T>> accessor)
{
return nameof(accessor.Body);
}
public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
{
return nameof(propertyAccessor.Body);
}
private static String nameof(Expression expression)
{
if (expression.NodeType == ExpressionType.MemberAccess)
{
var memberExpression = expression as MemberExpression;
if (memberExpression == null)
return null;
return memberExpression.Member.Name;
}
return null;
}
}
静的プロパティ/フィールドへのアクセス
TestExtension.nameof(() => myClass.MyOtherField)
関数内のパラメータにアクセスする:
void func (int a) {
TestExtension.nameof(() => a);
}
dynamic
?何のために? - leppieMemberExpression
それがどうなるかです。 - leppiePropertyExpression
クラス。行に固執するvar type = propertyAccessor.Body.GetType();
- あなたは正しいがMemberExpression
この例のために私がキャストしたいものでした。コードを更新します - Rob♦internal
それ以降のバージョンでは:) - leppie
nameOf
- で解決されますCompiletime
- 逆コンパイルした場合、コンパイラは(Namespace(!)を除いた)クラス名を代わりに定数文字列に変換します。
注意してください。
あなたがクラス名を取得したい場合typeof()
またはGetType()
で特定の(おそらく派生した)型を取得するRuntime
そしての値を読む
の.Name
-netのプロパティ< C#6
もっと読むMSDN
私の知る限りでは、魔法の文字列を使わなくてもよい3つの選択肢があります。
の名前これにはVisual Studio 2015が必要です(ただし、他のバージョンの.netフレームワークにコンパイルすることもできます)。
nameof(this.Property)
式を取り、この記事で見つかったようにプロパティ名を返すメソッドを使用してください」リフレクションを使用してプロパティの文字列名を取得する「
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
CallerMemberNameAttribute - (.net framework 4.5でのみ利用可能。元の記事は.net framework 4.0のような古いバージョンで、4.5が含まれていると言っていたため含まれています)このメソッドの引き戻しは現在のメソッドの文字列表現が必要な場合にのみ役に立ちますあなたはで活動しています。
public string IsChecked {
set{
Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked"
}
}
string GetCurrentMemberName([CallerMemberName] string memberName = "")
{
return memberName;
}
nameof演算子は渡された変数の文字列表現を返すので、nameof(var1)は "var1"を返します。引数の例外のように変数名を文字列として特定する必要があるコードを回避するのに役立ちます。
以前のバージョンでは、リフレクションツリーまたは式ツリーを使用して同様の効果を得ることができました。
nameof(parameter)
になる"parameter"
)ただし、VS2015は現在Roslynをサポートしている唯一のIDEであるため、VS2013以前ではこれは機能しません。 - Ian Kemp