2009-05-12 17 views
5

この質問が適切に策定されていない場合は、私にご負担ください。知らないことは問題の一部です。C#のプロパティ自体を参照してください。反射?ジェネリック?タイプ?

私が達成したいことの例は、WPFのPropertyChangedEventArgsにあります。あなたはプロパティがWPFに変更されたフラグにしたい場合は、このようにそれを実行します。

PropertyChanged(this, new PropertyChangedEventArgs("propertyName")); 

あなたが変更プロパティ名を指しPropertyChangedEventArgsへ文字列を渡します。

私のコード全体にプロパティ名のハードコーディングされた文字列が本当に必要ではないことが想像できます。リファクタリング・リネームはそれを逃してしまいます。そのため、審美的には魅力的ではなく、エラーが発生しやすくなります。

というよりむしろは、その性質自体を参照してください ...なんとか。

PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?)); 

私はこれを上記のような短い方法で包むことができるようです。

private void MyPropertyChanged(??) { 
    PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??)); 
} 

... so I can say something like: 
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself* 

これまでのところ、私は空白を描いています。

+0

も参照してください。http://stackoverflow.com/questions/388775/how-do-i-get-the-name-of-a-property-from-a-property-in-c-2-0 –

+0

http ://weblogs.asp.net/cazzu/archive/2006/07/06/Linq-beyond-queries_3A00_-strong_2D00_typed-reflection_2100_。aspx –

+0

[lambda式を使用してメソッド名と型を取得する]の可能な複製(http://stackoverflow.com/questions/273941/get-method-name-and-type-using-lambda-expression) – nawfal

答えて

6

残念ながら、これを直接行う方法はありません。しかし、あなたはExpression経由で.NET 3.5でそれを行うことができます。詳細についてはSee hereをご覧ください。 (代わりにPropertyInfoの名前を返すためにそれを変更することが非常に簡単である)

PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar); 

:例をコピーします。使用

OnPropertyChanged(x=>x.Name); 

同様に、バリアントを書くために非常に簡単になり

OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...} 
+0

thanks - great insight –

1

これは、頻繁に要求された機能、通常と呼ばれるinfoof( "の情報")であり、これはメンバーに関連付けられたリフレクションオブジェクトを返します。

PropertyInfo pi = infoof(Person.Name); 

悲しいことに、動的キーワードは、代わりにC#コンパイラチームの時間を吸収しています!

+0

偶然、ちょうど先週、私は "なぜinfoofofまだ?"今月中にそれを期待してください。 –

+0

「C#4の驚きの機能として、同じことをしても想像以上に優れたものをあなたに与えてくれるからね」 *十字架* –

+0

いいえ。 「この機能は、それがもたらす利益のためにあまりにも多くの仕事をしている」と言われています。失望して申し訳ありません。 –

1

文字列の指定を避ける方法はないと確信しています。C#または.NETに組み込まれている機能はありません。これは、私が知る限り、プロパティへの参照を渡し、stringをReflection APIはるかに簡単な方法です。

ただし、標準.NET以外では、PostSharp(.NET用のAspect Oriented Programming)で解決策を見つけることができます。これは、質問で示したように、さまざまなプロパティが変更されたときに発生イベントを自動化するコードを追加することができます。

+0

Expression APIではこれが許されています。私の答えでは「ここを見てください」という例があります。 –

+0

@Marc:ええ、それはあなたが正しいと思われますが、それは非常に丸い方法です。さらに、少なくとも私には醜いように思えます(少なくとも、構文は複雑です)。しかし、私は誰が言いたいのですか...それは尋問者が好むものかもしれません。 – Noldorin

関連する問題