2

给定以下类型:

class Parent { List<Child> Children {get;set;}}
class Child {List<Child> GrandChildren {get;set;}}

class Helper<TEntity> {List<string> Properties {get;set;}}

并在 Helper 上给出以下方法...

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”添加到我的“Properties”字符串列表中。

4

2 回答 2

2

如果 AddProps 方法是通用的,而不是整个 Helper 类,它可能会使事情变得更容易。

通过这种方式,您可以拥有以下代码:

var helper = new Helper();
helper.AddProps<Parent>(x => x.Children);
helper.AddProps<Child>(x => x.GrandChildren);

您可能还希望保留的不仅仅是属性名称,以便知道该属性属于哪种类型。我想你可以有一个字典来存储你注册的每种类型的属性。

PS 知道你为什么要这样做可能有助于 SO 社区更好地回答你的问题。

于 2009-09-12T17:38:23.293 回答
0

我最终使用了一个效果很好的替代解决方案。它使用这个新类...

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”现在具有“Children.GrandChildren”的值。

它不像我希望的那样优雅,但它的类型安全且易于使用。

于 2009-09-13T07:47:59.930 回答