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

我对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 Children { get { // Implementation that returns custom TreeItemCollection type } } public static IList GetTreeFromObject(IList items, Expression<Func> id, Expression<Func> text, Expression<Func<T, IList>> childProperty) where T : class { foreach (T item in items) { // Errrm!?? What do I do now? } return null; } } 

……可以通过…来调用

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

我可以用字符串值替换表达式,只使用reflection,但我试图避免这种情况,因为我想强制键入它。

我这样做的原因是我有一个接受类型为TreeItem的List的控件,而我有几十个不同的类型都在树状结构中,并且不想为每种类型编写单独的转换方法(尝试遵守DRY原则)。

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

没有像“lambda表达”这样的类型。 lambda表达式可以转换为兼容的委托类型或表达式树

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

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

然后你可以做这样的事情:

 foreach (T item in items) { string id = idSelector(item); string text = textSelector(item); IList children = childPropertySelector(item); // Do whatever you need here }