基于lambda表达式创建匿名类型
我试图创建一个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;
}
所以,我想创建基于给定表达式的匿名类型。我知道我可以评估这个表达式来检索正确的属性。
我有点卡住了,是这样的可能吗?
任何想法?
好,用一个简单的调用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
为好原清单如果你这样做,移动选择。 。到那里)
这么真实,我弄错了所有错误... – Bertvan 2009-04-16 20:33:48
是不是只是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<...>
,因为它似乎没有任何用处。
我不太确定,你想用匿名方式做什么? – driis 2009-04-16 20:28:50