2017-10-25 6 views
-1

각 노드에 Amounts 개체가있는 TreeNode 클래스를 사용하여 트리를 구성했습니다. Amounts 객체는 몇 가지 십진수 값을 저장하는 간단한 클래스입니다. 예 : 'C# 동적으로 lambda를 사용하여 속성을 설정 하시겠습니까?

public class Amounts 
{ 
    public decimal Amount1 { get; set; } 
    public decimal Amount2 { get; set; } 
    ... 
} 

나는 독립적으로 각각의 속성에 대한 몇 가지 코드를 수행하고, 무엇을 어떻게 든 람다를 사용하여이 방법에 대한 금액 호텔 중 한 곳 또는 이와 유사한을 통과하면된다 싶습니다 수 있어야하지만 난 할 수 이 작업을 수행하는 방법을 알아 냈습니다 (불행히도 도구에서 잠시 쉬었습니다). 리플렉션 SetPropertyValue 메서드를 사용할 수 있도록 속성 이름 문자열을 전달하는 아이디어가 특히 마음에 들지 않습니다.

탐색 방법이 아래처럼 보이길 원합니다. 나는 Linq가 Sum 방법을 지원한다는 것을 알고 있지만, 나는 이것을 단순화 된 예제로 사용했다. 실제 계산은 더 복잡한 것으로 수행되었다.

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

위의 코드에 의해 반환되는 값으로 작동하지 않습니다

public void Traverse(Func<ContributionAmounts, decimal> getter) 
{ 
    foreach (var child in this.Children) 
    { 
     getter(this.Amounts) += getter(child.Amounts); 
    } 
} 

오히려 각 금액에 대한 별도의 방법을하는 것보다, 뭔가 아래처럼 호출 할 수 할 싶습니다 Func는 10 진수 속성 (예 : Amount1)이 아닌 읽기 전용 10 진수 값입니다.

필자는 요구 사항을 잘 설명했는지 잘 모르겠지만 올바른 방향으로 포인터를 얻을만큼 충분히 기대됩니다.

덕분에, 존

+0

은 당신이해야 할 모든 컬렉션의 각 항목에 적용하고, 람다을 감안할 때. LINQ에는'Sum()'메서드가 포함되어 있으므로 this.Amounts.Amount1 + = this.Children.Sum (a => a.Amounts.Amount1);과 같이 간단합니다. 'Traverse()'메소드가 필요하지는 않습니다. –

+0

응답 해 주셔서 감사합니다. 예제를 단순화 한 것으로 보이므로 명확히하기 위해 예제를 업데이트했습니다. 질문은 자녀 가치를 합산하는 것에 그다지 중요하지 않지만 합계 금액을 지정하는 방법은 다릅니다. 다행히도 업데이트 된 예제를 통해이를 제거 할 수 있기를 바랍니다. – John

+0

'Traverse()'가 필요한 이유나 속성을 설정하는 방법을 모르겠습니다. 그것은 현재 인스턴스의 속성 일 뿐이므로 이전 주석에 게시 한 코드는 제대로 작동해야합니다. –

답변

0
public void Traverse(Func<Amounts, decimal> getter) 
{ 
    var a = new Amounts(); 
    decimal result = getter(a); 
} 

//... 

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

응답 해 주셔서 감사합니다. 이것은 내가 찾고있는 것과 비슷하지만, 단지 그것을 검색하는 것이 아니라 속성을 설정할 수 있어야합니다 (위의 업데이트 된 예제 참조). 건배 – John