2013-02-15 70 views
4

我有一個數據源,我不想綁定一個X的集合。 X應該包含某種類型的子集中,Y的屬性(假設Y的性能PropOne,PropTwo,PropThree) 這當然可以用一個匿名類型來完成:以類型安全的方式使用另一個實例的屬性子集創建一個實例?

void DoBind() 
{ 
    myGrid.DataSource = myCollectionOfYs.Select(y => new {y.PropOne, y.PropTwo}); 
} 

我怎麼能修改此方法,以便它的調用者可以以類型安全的方式指定要在投影中使用哪些屬性?即沿着線的東西:

var expressions = new List<Expression<Func<Y, object>>>(); 
expressions.Add(y => y.PropOne); 
expressions.Add(y => y.PropTwo); 
DoBind(expressions); 
+0

是否必須是完全動態的?或者你有N種可能的情況? – 2013-02-15 15:17:48

+0

那麼在使用Func 時會出現問題嗎? – 2013-02-15 15:23:51

+0

@Rui它應該是動態的,因爲方法的用戶應該完全自由地指定要包含在綁定數據中的任何屬性,並且不應該被迫改變DoBind方法或其任何依賴關係。 – Christian 2013-02-15 15:25:26

回答

2

使用你的想法:

void DoBind(Func<Y, object> func) 
{ 
    myGrid.DataSource = myCollectionOfYs.Select(funct); 
} 

,並使用類似:

DoBind(y => new {y.PropOne}); 
+0

當然!我一直堅持認爲你不能傳遞匿名類型,但是沒有阻止傳遞返回一個函數的函數。 :) – Christian 2013-02-15 15:58:13

2

你能不能在選擇功能傳遞給DoBind方法:

public static void DoBind<T, TResult>(ICollection<T> collection, Func<T,TResult> selector) 
{ 

    DataSource = collection.Select(selector) 
} 

,然後調用它像這樣:

 DoBind(list, y => new { y.Prop1, y.Prop2 }); 
     DoBind(list, y => new { y.Prop3, y.Prop2 }); 
+0

或者'public void DoBind (ICollection collection,Func selector)' – 2013-02-15 15:29:58

+0

謝謝。與@adrianfaciu一樣,他在上面的評論中提出瞭解決方案。 – Christian 2013-02-15 15:59:18

+0

是的,沒問題。這始終是一場比賽。 – 2013-02-15 16:43:48

相關問題