2010-11-24 5 views
2
public class TimeZone 
{ 
    public int Id { get; set; } 
    public string DisplayName{ get; set; } 
} 

私がしました:C#クラスプロパティの名前(文字列内)を取得する方法は?他のいくつかのクラスで

var gmtList = new SelectList(
     repository.GetSystemTimeZones(), 
     "Id", 
     "DisplayName"); 

注:System.Web.Mvc.SelectListを

私は "ID" とプロパティ名を記述する必要が好きではありません。 「DisplayName」と入力します。時間がたつと、プロパティ名が変更され、コンパイラはこのエラーを検出しない可能性があります。 C#文字列のプロパティ名を取得する方法は?クリスチャン・ヘイターの助けを借りて

UPDATE 1

、 私が使用することができます。

var tz = new TimeZone(); 
var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    NameOf(() => tz.Id), 
    NameOf(() => tz.TranslatedName)); 

OR

var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    NameOf(() => new TimeZone().Id), 
    NameOf(() => new TimeZone().TranslatedName)); 

を誰かが作成を必要とせず、他のアイデアを持っている場合新しいオブジェクト。それを共有するように自由に感じてください:)ありがとう。

答えて

13

あなたはこのように、式ツリーからプロパティ名を抽出するためのユーティリティメソッドを作成することができます。

string NameOf<T>(Expression<Func<T>> expr) { 
    return ((MemberExpression) expr.Body).Member.Name; 
} 

次に、あなたはそれを呼び出すことができますこのように:

var gmtList = new SelectList(repository.GetSystemTimeZones(), 
    NameOf(() => tz.Id), 
    NameOf(() => tz.DisplayName)); 

プロパティ値を読み取るわけではないので、クラスのインスタンスはすべて名前でしかないことに注意してください。

+0

これは素晴らしい解決策ですが、式ツリーを使用することによるパフォーマンス上のオーバーヘッドと、すべての参照を変更する必要があるときに必要なリファクタリングの量に注意してください。それは無視できるかもしれませんが、見つけ出す唯一の方法があります! –

+1

私はこれをプロファイリングしていませんが、理論的には、コンパイラによって既に構築されている式ツリーオブジェクトグラフからコードが動作しているので、名前を読むのはかなり速いはずです。式の* value *を読みたい場合、それはまったく別の問題です! –

+0

これで何かパフォーマンステストが行​​われましたか? MVVM INotifyPropertyChangedでそれを使用することは賢明でしょうか? –

0

(これらは、彼らがプロパティだ、ところでパラメータではありません。)

まあ、一つの選択肢は、デリゲートを使用することです。

その後
public class SelectList<T> 
{ 
    public SelectList(IEnumerable<T> source, 
         Func<T, string> idProjection, 
         Func<T, string> displayProjection) 
    { 
     ... 
    } 
} 

:たとえば

var gmtList = new SelectList<TimeZone>(repository.GetSystemTimeZones(), 
             tz => tz.Id, tz => tz.DisplayName); 
+0

ニースのオプションが、「System.Web.Mvc.SelectList」を使用することができる型の引数で使用することはできません。だから、私はこのソリューションを使用することはできません。とにかくありがとう:) – asdas

+1

@asdas:あなたがどのタイプで始まったのか言っていたなら、それは多大な助けになりました。あなたは私たちに何の文脈も与えませんでした。 –

0

var name = (string) typeof(TimeZone).GetProperty("DisplayName").GetValue(0);

+0

もう一度、引用符付きのDisplayNameを作成しています。とにかくありがとう、ありがとう。 – asdas

+0

外部のデータソースから値を取得する変数で置き換えることができます。) –

0
string id=typeof(TimeZone).GetProperties()[0].Name; 
string displayName=typeof(TimeZone).GetProperties()[1].Name; 


var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    id, 
    displayName); 

DisplayNameおよびIdが宣言される順序が変更されない場合を除き、これは、動作します。 または、idとdisplaynameを区別するためにプロパティの属性を定義すると考えることができます。

+0

実用的な解決法です:)しかし、あまり実用的ではありません。ありがとうございました。 – asdas

0

C#6.0ので、あなたが今

var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    nameof(TimeZone.Id), 
    nameof(TimeZone.DisplayName)); 
関連する問題