2011-07-08 4 views
1

奇妙なものが少しありましたが、私の狂気の裏には理由があります。明示的にプロパティを参照してC#.NETリソースのプロパティ名を取得する

私はいくつかの文字列プロパティを設定したリソースを持っています。たとえば、それぞれ "Admin"や "Accounts"のような値を持つMenuAdminLabelMenuAccountsLabelです。私はメソッドにラベルのプロパティ名を渡す必要があります。私はちょうど "MenuAdminLabel"や "MenuAccountsLabel"のような文字列としてこれらを渡すことができますが、私はコンパイラで単純な文字列ではなく、リソースには多くのプロパティがあり、それぞれの参照が正しいことを確認したいと考えています。

私はResource.MenuAdminLabelにアクセスすると問題が発生します。(明らかに)プロパティ名ではなくリソースプロパティの値を取得しますが、を使用してプロパティリストにアクセスできますが、再びリテラル文字列コンパイラが検証することができるLocalisation.Resource.MenuAdminLabelを明示的に使用するものではなく、プロパティ名を取得することができます。

どうすればいいですか?

+0

説明のために、この式を属性宣言で使用したくないのですか?これにはλ属性が必要ですが、属性を使用するときはサポートされていません。 –

答えて

2

これは、INotifyPropertyChangedを実装するときによく遭遇する問題です。溶液を

MyMethod(() => Localisation.MenuAdminLabel); 

代わりに

MyMethod("MenuAdminLabel"); 

ようなラムダ式を使用して発現を分析することです。 1つの実装例はthis answerにあります。あなたの場合は、次のようになります:

private void MyMethod<TValue>(Expression<Func<TValue>> propertySelector) 
{ 
    var memberExpression = propertySelector.Body as MemberExpression; 
    if (memberExpression == null) 
     throw new ArgumentException(); 

    string name = memberExpression.Member.Name; 

    // Do stuff with name 

} 
+0

ここにサンプルがあります:http://blog.decarufel.net/2009/07/how-to-use-inotifypropertychanged-type_22.html –

+0

返信名を追加しました。戻り値の型を文字列に変更しました。これは夢のように動作します。ありがとうございます。 –

関連する問題