2

我正在尝试为 Winforms Datagrid 创建一个流畅的界面。这应该允许我使用类型化的数据源并轻松使用属性的属性(Order.Custom.FullName)

我在初始化时添加列并尝试设置要在那里使用的属性:

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;
}

所以,我想根据给定的表达式创建匿名类型。我知道我可以评估该表达式以检索正确的属性。

我有点卡住了,这样的事情可能吗?

有任何想法吗?

4

2 回答 2

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。如果需要,请将选择移到那里。)

于 2009-04-16T20:30:15.160 回答
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<...>到 just Func<...>,因为它似乎没有任何作用。

于 2009-04-16T20:31:41.163 回答