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

标签 c# .net linq lambda

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

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

我的做法是否正确?也许有更好的方法吗?

最佳答案

没有“lambda 表达式”这样的类型。 lambda 表达式可以转换为兼容的委托(delegate)类型,或者 expression tree .

您现有的方法签名使用了表达式树——但目前还不清楚它是否真的需要这样做。尝试委托(delegate)形式(更改一些参数名称):

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
}

关于c# - 如何处理作为参数传递给方法的 Lambda 表达式 - C# .NET 3.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2537572/

相关文章:

c# - 使用格式模板解析字符串?

c# - 自动更新 NHibernate 中的相应集合?

c# - 如何访问加载到类中的 JSON?

c# - 使用 naudio 播放 .wav 文件,播放在 1 秒后停止

c# - 使用 JSON.NET 和 LINQ 计算我的 JSON 文件中的子项数

c# - 改进 Linq-XML 到对象查询

c# - 如何将带有标志属性的枚举格式化为十六进制值?

c# - 如何在 .NET 中装饰(时间)任务?

c# - 根据其属性之一从 C# 列表中删除重复项

c# - 将列表框的选定项目显示到消息框中