2010-11-22 11 views
5

私の表情はあまり良くありませんので、私はそれらを改善したいので、誰かが私のために説明することができるかどうかは、このようなインスタンス化の間に値を与えることができるクラスでプロパティを作成することができますか?式<Func <TModel、TProperty >>をオブジェクトの初期化のプロパティとして使用しますか?

public class Column<TModel> 
{ 
     public Expression<Func<TModel, TProperty>> ColumnProperty { get; set; } 
} 
new Column<Product>{ ColumnProperty = p => p.Title}; 

またはより良いまだ、このようなクラスの何かを

new Column {ColumnProperty = p => p.Title}; 

を(しかし、私はそれを押していますだと思います)それの背後にある基本的な考え方は、このようなColumnオブジェクトの束からGridを作成することです。

List<Product> productList = GetProductsFromDb(); 
List<Column> columnList = new List<Column>(); 

columnList.Add(new Column<Product> {ColumnProperty = p => p.ProductId, Heading = "Product Id"}); 
columnList.Add(new Column<Product> {ColumnProperty = p => p.Title, Heading = "Title"}); 

Grid myGrid = new Grid(productList, columnList); 

これは、これを行うにはtidiest /最も簡単な方法ではないかもしれないが、私は表現の私の理解を向上させたいと私は代わりに、強く型付けされた値を持つことができることを愛するよう、それは行うことができますかどうかを知ることに興味を持っています文字列リテラルの場合、それはとてもうまく動作します。

任意の考え、アイデア、とりとめが大幅

乾杯 ロブ

答えて

7

それはTModelのタイプを取り、TPropertyタイプを返すメソッドがあることを意味します。したがって、ラムダ式は、

p => p.ProductId 

のように、プロパティ自体ではなくプロパティの値を返します。

public Expression<Func<TModel, object>> ColumnProperty { get; set; } 

は、その後、あなたが式ツリーから詳細な情報を抽出することができます:あなたはこの構文を動作させるために何ができるか

は、次のようにあなたのColumnPropertyを定義することです。

+0

こんにちはidursun - ありがとう、これも動作します - 私はオブジェクトの代わりに動的を使用しましたが、結果は同じです – Rob

1

[OK]をいただければ幸いですので、私はちょうど脳波を持っていたし、ダイナミックにTPropertyを変更し、私は今、私は私自身に答えを推測ので、これを行うことができます質問が、このアプローチの長所/短所についての他の人々の思考に熱心のようになります。実際には

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty.Compile().Invoke(p); 
} 

私は

public Func<TModel, dynamic> ColumnProperty { get; set; } 

に私のプロパティを変更する場合、私はちょうど行うことができます:あなたはFunc<TModel, TProperty>のようなものを定義するとき

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty(p); 
} 
+0

表現アプローチはまともなアプローチです。私は、「動的」には少しオーバーヘッドが必要だと思いますが、影響はごくわずかです。動的オブジェクトは、シーンの背後にあるオブジェクトメンバーの辞書を維持する。 – IAbstract

関連する問題