2010-11-29 7 views
-1

を所有する上でPROPERTYNAMEを取得し、私は、次の構文を持っていますそれをしないでください。私はプロパティでそれを所有するクラスの名前は何かを知る必要があります。タイプC#

+0

独自のバージョンのCLRを作成しなければ、これを行うことはできません。 – SLaks

答えて

2

これはまったく完全に不可能です。

複数のプロパティで1つのインスタンスを参照できます。オブジェクトとそれが参照するプロパティとの間には接続がありません。

さらに、JITインライン化は、プロパティが必ずしも関与しないことを意味する可能性があります。
さらに、最適化されたバイナリにローカル変数名が存在しません。

+0

まあまあではない、本当に本当に本当に難しい。 Stack Traceを使用してHelloが呼び出されているメソッドを取得できます。次に、メソッド本体を使用してそれを把握します。そこからでも私はそれをする良い方法が見えません。しかし、すべての意図と目的のために、あなたの答えは正しいものです。 –

+0

@Yuriy:いいえ。それは本当に不可能です。あなたの呼び出しが非自明なメソッドのどこから生じたのかを確実に把握することはできません。 (おそらく、JITterを複製したり、2番目のプロセスを作成して管理されたデバッガとして最初のプロセスに接続する場合は、どちらも_insane_であり不可能です) – SLaks

+0

あなたのご質問は、あなたのデザインが深刻に間違っていることを意味します。プロパティ(ローカル変数ではありません)をサポートする必要がある場合のみ可能です。スタックトレースを見て、メソッドがBla.Hello()を呼び出しているオブジェクトを見つけ、反射を使用してオブジェクトのすべてのプロパティとフィールドを調べ、値がBlaインスタンスであるものを探します。 – Ran

1

あなたが求めているとは思えません。多分それを行うための一つの方法は、あなたがインスタンスを作成するときに、あなたは文字列で渡すことができ、文字列を取るためのBlaのコンストラクタのために次のようになります。

SomeProperty = new Bla("SomeProperty"); 
AnotherProperty = new Bla("AnotherProperty"); 
+0

は現在の解決策ですが、誰かがプロパティの名前を変更してコンストラクタを忘れた場合、ロジックは失敗しますが、コンパイラはそれを確認できません。 – Kolja

1

あなたはreliabily反射でこれを行うことができる方法はありませんし、それはまず最初にしたいと思うひどい考えです。インスタンスに対してonメソッドを呼び出すことは、変数を宣言することなしに可能です。例:

string name=new Bla().Hello(); 

このシナリオでは、どのように印刷しますか?

+0

+1その反例について忘れてしまった – SLaks