使用Func <t,object =“”>设置子列表中项的属性

时间:2017-01-05 13:20:03

标签: c# .net lambda

我有一个包含属性的父项和子项:

public class Parent
{
    public bool IsValid { get; set; }
    public Child ChildItem { get; set; }
    public List<ChildListItem> ChildList { get; set; }
}

public class ChildItem
{
    public bool IsValid { get; set; }
}

public class ChildListItem
{
    public bool IsValid { get; set; }
}

我有一个函数,它使用一般函数列表来设置值:

foreach (Func<T, object> function in functions)
{
    function.Invoke(Parent);
}

这些功能填充如下:

public Func<T, object>[] functions { get; set; }

this.functions = FunctionsToArray<Parent>(x => x.IsValid = true,
                                               x.Child.IsValid = true);

供参考:

public static Func<T, object>[] FunctionsToArray<T>(params Func<T, object>[] functions)
{
    return functions.ToArray();
}

我想做的是设置每个子列表项,例如:

this.functions = FunctionsToArray<Parent>(x => x.IsValid = true,
                                               x.Child.IsValid = true,
                                               x.ChildList.<something>.IsValid = true);

建议/意见/任何事情都将不胜感激。

2 个答案:

答案 0 :(得分:1)

首先,我认为您实际上打算使用Action<Parent>而不是Func<Parent, object>,因为您的示例lamba表达式实际上都没有返回任何内容。如果是这种情况那么你只需要一个lambda表达式来迭代列表并设置值,这可以通过常规foreach

来完成
x => { foreach(var cli in x.ChildList) cli.IsValid = true; }

或者由于该集合是List,您可以使用它的ForEach方法

x => x.ChildList.ForEach(cli => cli.IsValid = true)

你甚至可以创建一个可以完成所有三个

的lambda
x => 
{
    x.IsValid = true;
    x.Child.IsValud = true;
    foreach(var cli in x.ChildLIst)
        cli.IsValid = true;
}

答案 1 :(得分:0)

你可以这样做:

x => x.ChildList.ForEach(childListItem => childListItem.IsValid = true)