嵌套LAMBDA与流利的接口使用
问题描述:
考虑以下几种类型:嵌套LAMBDA与流利的接口使用
class Parent { List<Child> Children {get;set;}}
class Child {List<Child> GrandChildren {get;set;}}
class Helper<TEntity> {List<string> Properties {get;set;}}
而鉴于对助手下面的方法...
public Helper AddProps<TEntity, TProp>(Expression<Func<TEntity, TProp>> exp)
{
this.Properties.Add(GetPropInfo(exp).Name);
}
public PropertyInfo GetPropInfo(Expression<Func<TEntity, TProp>> exp)
{
return (PropertyInfo)((MemberExpression)(expression.Body)).Member;
}
我能做到这一点:
Helper<Parent> myHelper = new Helper<Parent>();
myHelper.AddProps(x => x.Children);
myHelper上的字符串列表“Properties”将包含值“Children”,即通过表达式传递的属性的名称。
我现在要做的是能够实现同样的事情,只有能够反映类型层次结构。
它会是这样吗?
x => x.Children { xx => xx.GrandChildren }
或者是它甚至有可能,什么将参与?我以前见过嵌套的lambda,但不知道涉及到什么。
在此先感谢!
编辑
似乎有一些混乱,所以我会尽力澄清。我希望能够使用lambda表达式和方法链接创建一个类似于“Object.SubObject.SubSubObject”的字符串。我的例子是这样做的,但仅限于一个级别(类的属性)。我想要做的就是扩大这个范围,以达到任何深度。
例如,我想使用lambda表达式与连贯接口,将看起来像这样....
AddProps(X => x.Children).AddProps(XX => XX。 GrandChildren),并且会在我的“属性”字符串列表中添加“Children.GrandChildren”。
答
我最终使用了一种很好的替代解决方案。它使用这个新类...
public class PartBuilder
{
private List<string> Parts;
/// <summary>
/// Gets a dot delimited string representing the parts
/// </summary>
public string Value
{
get
{
return string.Join(".", this.Parts.ToArray());
}
}
/// <summary>
/// Creates a new PartBuilder
/// </summary>
private PartBuilder()
{
this.Parts = new List<string>();
}
/// <summary>
/// Creates a new PartBuilder
/// </summary>
public static PartBuilder Create()
{
return new PartBuilder();
}
/// <summary>
/// Gets a property name from an expression
/// </summary>
public PartBuilder AddPart<TEntity, TProp>(Expression<Func<TEntity, TProp>> expression)
{
PropertyInfo prop = (PropertyInfo)((MemberExpression)(expression.Body)).Member;
this.Parts.Add(prop.Name);
return this;
}
}
现在,我有这个新的类,我可以做到这一点...
string typeHierarchy = PartBuilder.Create()
.AddPart((Parent p) => p.Children)
.AddPart((Child pp) => pp.GrandChildren)
.Value;
变量“typeHierarchy”现在有“儿童的价值。。孙子”
这不是优雅,我本来希望,但它是类型安全和易于使用的
答
如果AddProps方法是泛型的,而不是整个Helper类,它可能会让事情变得更简单。
通过这种方式,你可以有这样的代码:
var helper = new Helper();
helper.AddProps<Parent>(x => x.Children);
helper.AddProps<Child>(x => x.GrandChildren);
您可能还希望让你知道物业是属于哪种类型的保留不仅仅是属性名称等等。我想你可以有一个词典来存储你注册的每种类型的属性。
P.S.知道你为什么要这样做可能会帮助SO社区更好地回答你的问题。
我无法弄清楚你想在这里做什么试试这个:编写代码因为你想做的只是普通的“命名”方法,然后决定是否要将这些命名的方法转换为lambda表达式,如果你这样做,从“底部”开始,按照你的方式“向上”转型应该是直截了当的。 – 2009-09-12 14:38:32