Создание анонимных типов на основе лямбда-выражения - PullRequest
2 голосов
/ 17 апреля 2009

Я пытаюсь создать свободный интерфейс к сетке данных Winforms. Это должно позволить мне использовать типизированный источник данных и легко использовать свойства свойств (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;
}

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

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

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 17 апреля 2009

Ну, с простым вызовом 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. Если вы это сделаете, переместите туда выборку.)

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

...