2010-12-06 7 views
8

は、我々は、私は、アセンブリ情報自体から読み取ることにより、プロパティ名であることを上記の変数propNameの値を設定するにはどうすればよいそのプロパティのgetter/setter内からプロパティ名を取得する方法は?

public string SomeProperty 
{ 
    get 
    { 
     var propName = "SomeProperty"; 
     return "<" + propName + ">"; 
    } 
} 

以下のようにプロパティを持っているとしましょうか?

編集

我々はこれを必要とするのはなぜ?非常に多くの場合、バインドされた値は、デザインモードで、空の文字列として表示されます - 私は私がバウンドプロパティのための「デザインモード」値を表示するのに役立ちますWPF hereで述べたようにd:DataContextを使用してい

。また、 'design-mode'データコンテキストクラスでは、私が持つ可能性があるすべてのバインディングプロパティのプロパティ名を返したいと思います。

これはあなたの懸念を説明します。

+1

ことは明確にしてくださいそれ。 –

+0

あなたはこれをなぜやっていますか?特定の要件はありますか – TalentTuner

+1

プロパティを作成したい場合は、それ自体の名前を返しますか? –

答えて

10

が必要な理由は私はわかりません。

string SomeProperty 
    { 
     get 
     { 
      return GetDesignModeValue(() => this.SomeProperty); 
     } 
    } 

    string GetDesignModeValue<T>(Expression<Func<T>> propertyExpression) 
    { 
     var propName = (propertyExpression.Body as MemberExpression).Member.Name; 
     var value = string.Format(
      "<{0}>" 
      , propName); 
     return value; 
    } 

だから、今から、時にデザインモードで私たちは結合特性mocking値を表示するために多くの方がはるかに簡単です。

私はいつか役立つと思います!

+0

は必要ありません。完璧に動作します。 – mynkow

+1

Visual Studio 2015を使用する場合、演算子キーワード[nameof(this.SomeProperty)]を使用できます(https://msdn.microsoft.com/en-us/library/dn986596.aspx) –

4

実行時に信頼性の高い方法はありませんが、MethodBase.GetCurrentMethod().Nameを使用して最初の4文字を捨てることができます。

このアプローチにはいくつかの欠陥があります。難読化ツールでバイナリを実行すると、メソッドの名前が変更される可能性があります。また、メソッドがインライン化され、問題が発生する可能性があります(長さを確認せずに文字列にRemoveを使用すると、デバッグモードで再現しにくいリリースビルドで予期しないクラッシュが発生することさえあります)。

コードがパターンに従っていて、そのようなプロパティを多数生成する必要がある場合は、コードジェネレータやアスペクト指向プログラミングフレームワークのようなコンパイル時のアプローチを使用する方がよいでしょう。

1

これも動作するはずですが、あなたは私が私には非常に便利である、以下のような解決策を見つけ出すしばらくこの

public string SomeProperty 
    { 
     get 
     { 
      StackTrace st = new StackTrace(); 
      StackFrame[] fr = st.GetFrames(); 
      if (fr != null) 
      { 
       var propName = fr[0].GetMethod().Name.Substring(3, fr[0].GetMethod().Name.Length); 
       return "<" + propName + ">"; 
      } 

      return "SomeProperty"; 

     } 
    } 
+0

私はこれがなぜ必要なのかを説明するために私の質問を更新しました。ありがとうSaurabh –

+0

'Name.Substring(4)'の前に 'set_'または' get_'が付いていますが、2番目のパラメータ – Ant

-3

プロパティの名前をゲッターに渡すことは可能です。

このmyobjはオブジェクトであり、PROPNAMEは、次のコードは、仕事をしている、プロパティの名前を保持する変数である場合場合:あなたがしたいと思いますどこ

eval("Object.defineProperty(MyObj, PropName, { " + 
    "get : function() { return(\"the prop name is " + PropName + "\"); } });"); 
+1

これはC# ... –

関連する問題