web-dev-qa-db-ja.com

.net framework 4のnameof式

「nameof」式はVisual Studio 2015およびC#6で導入されました

nameof(C#およびVisual Basicリファレンス)

.net framework 4のような古いバージョンでどのように使用するか、同様のメソッドを記述できますか?.

22
MSL

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);
}
27
Rob

nameOf-Compiletimeで解決されます-逆コンパイルすると、コンパイラがクラス名(Namespace(!)なし)を代わりに定数文字列に変換したことがわかります。だから注意してください!

クラスの名前を取得したい場合は、typeof()またはGetType()を使用してRuntimeで特定の(おそらく派生した)型を取得し、
。NETの.Name- Property <C#6。

詳しくは [〜#〜] msdn [〜#〜] をご覧ください。

4
Cadburry

私の知る限り、マジックストリングを使用する必要がない3つのオプションがあります。

  1. nameofこれにはVisual Studio 2015が必要です(ただし、.netフレームワークの他のバージョンにコンパイルできます)

    nameof(this.Property)
    
  2. 式を取り、この投稿で見つかったプロパティ名を返すメソッドを使用します " リフレクションを使用してプロパティの文字列名を取得 "

    var propertyName = GetPropertyName(  
        () => myObject.AProperty); // returns "AProperty"
    
  3. CallerMemberNameAttribute-(.net framework 4.5でのみ利用可能、元の投稿では4.5を含む.net framework 4.0のような古いバージョンと述べているため、含まれています)このメソッドの欠点は、現在のメソッドの文字列表現が必要な場合にのみ役立つあなたが働いています。

    public string IsChecked  {
       set{
           Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked"
       }
    }
    
    string GetCurrentMemberName([CallerMemberName] string memberName = "")
    {
         return memberName;
    }
    
2
JamesF

Nameof演算子は、渡された変数の文字列表現を返すので、nameof(var1)は「var1」を返します。これは、引数例外のように文字列として変数名を指定する必要があるコードを回避するのに役立ちます。

以前のバージョンでは、リフレクションまたは式ツリーを使用して同様の効果を達成できました。

1
BhavO