Как обрабатывать лямбда-выражения, переданные в качестве аргумента в метод - C # .NET 3.5 - PullRequest
5 голосов
/ 29 марта 2010

Мои знания о лямбда-выражениях немного шатки, хотя я могу писать код, использующий лямбда-выражения (он же LINQ), я пытаюсь написать собственный метод, который принимает несколько аргументов типа лямбда-выражения. *

Справочная информация. Я пытаюсь написать метод, который возвращает коллекцию объектов типа TreeItem из буквально ЛЮБОГО другого типа объекта. Пока у меня есть следующее:

public class TreeItem
{
    public string Id { get; set; }
    public string Text { get; set; }

    public TreeItem Parent { get; protected set; }

    public IList<TreeItem> Children
    {
        get
        {
            // Implementation that returns custom TreeItemCollection type
        }
    }

    public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items,
        Expression<Func<T, string>> id,
        Expression<Func<T, string>> text,
        Expression<Func<T, IList<T>>> childProperty) where T : class
    {
        foreach (T item in items)
        {
           // Errrm!?? What do I do now?
        }

        return null;
    }
}

... который можно вызвать через ...

IList<TreeItem> treeItems = TreeItem.GetTreeFromObject<Category>(
    categories, c => c.Id, c => c.Name, c => c.ChildCategories);

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

Мои причины для этого состоят в том, что у меня есть элемент управления, который принимает список типа TreeItem, тогда как у меня есть десятки различных типов, которые находятся в древовидной структуре, и я не хочу писать отдельные методы преобразования для каждого тип (пытаясь придерживаться принципа СУХОЙ).

Правильно ли я поступаю? Возможно, есть лучший способ сделать это?

1 Ответ

7 голосов
/ 29 марта 2010

Нет такого типа, как «лямбда-выражение». Лямбда-выражение может быть либо преобразовано в совместимый тип делегата, либо дерево выражений .

Ваша существующая сигнатура метода использует деревья выражений - но не совсем понятно, что это действительно нужно. Попробуйте форму делегата (с несколькими изменениями имени параметра):

public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items,
    Func<T, string> idSelector,
    Func<T, string> textSelector,
    Func<T, IList<T>> childPropertySelector) where T : class

Тогда вы можете сделать что-то вроде этого:

foreach (T item in items)
{
    string id = idSelector(item);
    string text = textSelector(item);
    IList<T> children = childPropertySelector(item);
    // Do whatever you need here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...