如何处理作为参数传递给方法的Lambda表达式 - C#.NET 3.5

时间:2010-03-29 11:48:12

标签: c# .net linq lambda

我对Lambda表达式的了解有点不稳定,而我可以编写使用Lambda表达式(又名LINQ)的代码,我正在尝试编写自己的方法,该方法接受一些Lambda Expression类型的参数。

背景:我正在尝试编写一个方法,从字面上的任何其他对象类型返回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的List的控件,而我有几十个不同的类型都在树状结构中,并且不想为每个类型编写单独的转换方法类型(试图遵守DRY原则)。

我是以正确的方式来做这件事的吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:7)

没有“lambda表达”这样的类型。 lambda表达式可以转换为兼容的委托类型,也可以转换为expression tree

您现有的方法签名使用表达式树 - 但它根本不清楚它确实需要。尝试委托表单(更改一些参数名称):

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
}