2009-04-16 89 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<...>,因为它似乎没有任何用处。