C#使用lambda动态设置属性?

C#使用lambda动态设置属性?,c#,reflection,lambda,properties,C#,Reflection,Lambda,Properties,我有一个使用TreeNode类构建的树,其中每个节点都有一个对象。Amounts对象是一个简单的类,包含一些十进制值。例如 public class Amounts { public decimal Amount1 { get; set; } public decimal Amount2 { get; set; } ... } 我需要能够独立地为每个单独的属性执行一些代码,我想做的是使用lambda或类似的方法将Amounts属性中的一个传递给这个方法,但我不太清楚如何

我有一个使用TreeNode类构建的树,其中每个节点都有一个对象。Amounts对象是一个简单的类,包含一些十进制值。例如

public class Amounts
{
    public decimal Amount1 { get; set; }
    public decimal Amount2 { get; set; }
    ...
}
我需要能够独立地为每个单独的属性执行一些代码,我想做的是使用lambda或类似的方法将Amounts属性中的一个传递给这个方法,但我不太清楚如何做到这一点(不幸的是,我已经有一段时间没有使用工具了)。我并不特别喜欢传递属性名字符串以便使用反射SetPropertyValue方法

我希望遍历方法如下所示。我知道Linq支持求和方法,但我只是将其用作一个简化的示例,实际执行的计算更加复杂

public void Traverse(Func<ContributionAmounts, decimal> getter)
{
    foreach (var child in this.Children)
    {
        getter(this.Amounts) += getter(child.Amounts);
    }
}
上面的代码不起作用,因为Func返回的值是只读十进制值,而不是十进制属性(例如Amount1)

我不确定我是否已经很好地解释了这个要求,但希望足够得到一个指向正确方向的指针

谢谢, John

公共无效遍历(Func getter)
{
var a=新金额();
十进制结果=getter(a);
}
//...
横向(t=>t.Amount1);
横向(t=>t.Amount2);

给定lambda,您所要做的就是将其应用于您的收藏中的每个项目。LINQ包含一个
Sum()
方法,因此它非常简单,如
this.Amounts.Amount1+=this.Children.Sum(a=>a.Amounts.Amount1)。似乎不需要您的
Traverse()
方法。感谢您的回复。我似乎过于简化了这个例子,所以我对它进行了更新以澄清。问题不在于对子值求和,而是如何指定要求和的数量。希望更新后的示例能够澄清这一点。我不明白为什么需要
Traverse()
或设置属性的方法。这只是当前实例的属性,因此我在前面的评论中发布的代码应该可以正常工作。也就是说,如果您坚持:您必须同时传递
getter
setter
参数,后者类似于
Action
Action
,lambda看起来像
d=>this.Amounts.Amount1+=d
(ca,d)=>ca.Amounts.Amount1+=d
。即,基本上与标记的副本相同,但也有一个setter委托。因为即使在后一种情况下,
ca
也是调用方知道的,所以我不明白为什么需要该版本。由于您不需要该版本,因此根本不需要
Traverse()
。感谢您的回复。这与我正在寻找的内容非常接近,但我需要能够设置属性,而不仅仅是检索它(请参见上面更新的示例)。干杯
Traverse(a => a.Amount1);
Traverse(a => a.Amount2);
public void Traverse(Func<Amounts, decimal> getter)
{
    var a = new Amounts();
    decimal result = getter(a);
}

//...

Traverse(t => t.Amount1);
Traverse(t => t.Amount2);