2009-04-16 39 views
2

我試圖創建一個Fluent接口到Winforms Datagrid。這應該允許我用一個類型的數據源和易用性的特性(Order.Custom.FullName)基於lambda表達式創建匿名類型

我加入在初始化列,並試圖將該屬性設置爲使用有:

dgv.With<Order>().Column("Client Name").On(x => x.Client.FullName); 

原來的問題,然後設置數據源時提出本身:

dgv.SetTypedDatasource<T>(IList<Order> orders) 

這裏的一個大問題是,通用控件是不可能的(我猜),讓T不能爲類指定,但必須是每種方法指定...

我想創建一個匿名類型的列表,基於在lambda表達式給定的屬性:

類似:

ProcessList<Client>(clientList, x => x.FullName); 

是否有可能做這樣的事情:

[編輯]請注意,在實踐中,表達式將設置得更早,並將在其他地方提取...

public void ProcessList<T>(IList<T> sourceList, Expression<Func<T, object>> expression) 
{ 
    var list = 
     (from T x 
     in sourceList 
     select new { expression }) 
     .ToList(); 

    // process list .... grid.DataSource = list; 
} 

所以,我想創建基於給定表達式的匿名類型。我知道我可以評估這個表達式來檢索正確的屬性。

我有點卡住了,是這樣的可能嗎?

任何想法?

+0

我不太確定,你想用匿名方式做什麼? – driis 2009-04-16 20:28:50

回答

4

好,用一個簡單的調用Select可以非常接近:

ProcessList(clientList.Select(x => new { x.FullName })); 

... 

public void ProcessList<T>(IEnumerable<T> list) 
{ 
    // process list ... T will be an anonymous type by now 
    grid.DataSource = list; 
} 

(即假設你不需要在ProcessList爲好清單如果你這樣做,移動選擇。 。到那裏)

+0

這麼真實,我弄錯了所有錯誤... – Bertvan 2009-04-16 20:33:48

2

是不是隻是grid.DataSource = sourceList.AsQueryable().Select(expression).ToList();

注意,這將是更好地引入第二通用,使得列表類型:

public static void ProcessList<TSource, TValue>(
     IList<TSource> sourceList, 
     Func<TSource, TValue> expression) 
    { 
     grid.DataSource = sourceList.Select(expression).ToList(); 
    } 

注我從Expression<...>切換到Func<...>,因爲它似乎沒有任何用處。