Создание анонимных типов на основе лямбда-выражения

Я пытаюсь создать свободный интерфейс для Winforms Datagrid. Это должно позволить мне использовать типизированный источник данных и легко использовать свойства свойств (Order.Custom.FullName)

Я добавляю столбцы при инициализации и пытаюсь установить свойство для использования там:

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

Затем исходный вопрос возникает при настройке источника данных:

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

Большая проблема здесь в том, что универсальные элементы управления невозможны (я думаю), поэтому T не может быть указан для класса, но должен быть указан для каждого метода...

Я хочу создать список анонимных типов на основе заданного свойства в лямбда-выражении:

что-то типа:

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

Итак, я хотел бы создать анонимные типы на основе данного выражения. Я знаю, что могу вычислить это выражение, чтобы получить правильные свойства.

Я немного застрял, возможно ли что-то подобное?

Любые идеи?


person Bertvan    schedule 16.04.2009    source источник
comment
Я не совсем уверен, что вы хотите в своем анонимном типе?   -  person driis    schedule 17.04.2009


Ответы (2)


Ну, с помощью простого вызова 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. Если он вам нужен, переместите выделение туда.)

person Jon Skeet    schedule 16.04.2009
comment
Обратите внимание, что если это сетка winform, ей понадобится ToList() - однако сетки веб-форм довольны IEnumerable. - person Marc Gravell; 17.04.2009
comment
Тем не менее, не совсем то, что мне нужно, я объясню немного больше в вопросе. - person Bertvan; 17.04.2009
comment
@Марк, да, я забыл эту строчку :) - person Bertvan; 17.04.2009

разве это не просто 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<...>, так как это казалось бесполезным.

person Marc Gravell    schedule 16.04.2009