2017-10-25 3 views
-1

Ich habe einen Baum, der mit einer TreeNode-Klasse erstellt wurde, wobei jeder Knoten ein Amounts-Objekt hat. Das Mengenobjekt ist eine einfache Klasse, die einige Dezimalwerte enthält. Z.B.C# Eigenschaft dynamisch mit Lambda gesetzt?

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

Ich muss in der Lage, einen Code für jede einzelne Eigenschaft unabhängig auszuführen, und was würde ich tun irgendwie eine der Beträge Eigenschaften dieser Methode übergeben wird eine Lambda oder ähnliches verwenden, aber ich kann‘ t wie es geht (ich bin leider schon eine Weile von den Werkzeugen weg). Mir gefällt die Idee, einen String für den Eigenschaftsnamen zu übergeben, nicht besonders, damit ich die Reflection SetPropertyValue-Methode verwenden kann.

Ich möchte die Traversal-Methode wie folgt aussehen. Ich bin mir bewusst, dass Linq eine Sum-Methode unterstützt, aber ich habe dies nur als ein vereinfachtes Beispiel verwendet, wobei die tatsächliche Berechnung komplexer ist.

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

vielmehr ein separates Verfahren für jede Menge, als wenn, würde Ich mag Lage zu tun, wäre es wie unten etwas zu nennen:

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

Der obige Code nicht als Wert zurückgegeben funktioniert durch Der Func ist ein schreibgeschützter Dezimalwert und nicht die Dezimaleigenschaft (z. B. Amount1).

Ich bin nicht sicher, ob ich die Anforderung sehr gut erklärt habe, aber hoffentlich genug, um einen Zeiger in die richtige Richtung zu bekommen.

Danke, John

+0

das Lambda gegeben, alles, was Sie tun müssen, ist es in Ihrer Sammlung jedes Element anwenden. LINQ enthält eine 'Sum()' Methode, also ist es so einfach wie 'this.Amounts.Amount1 + = this.Children.Sum (a => a.Amounts.Amount1);'. Es scheint keinen Bedarf für Ihre 'Traverse()' Methode zu geben. –

+0

Danke für die Antwort. Es scheint, dass ich das Beispiel zu sehr vereinfacht habe, also habe ich es zur Klärung aktualisiert. Bei der Frage geht es nicht so sehr darum, die Kinderwerte zu summieren, sondern wie man den Betrag zur Summe angibt. Hoffentlich macht das aktualisierte Beispiel dies klar. – John

+0

Ich sehe nicht, warum Sie 'Traverse()' oder eine Möglichkeit zum Festlegen der Eigenschaft benötigen. Es ist nur die Eigenschaft der aktuellen Instanz, daher sollte der Code, den ich in meinem vorherigen Kommentar gepostet habe, gut funktionieren. –

Antwort

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

Danke für die Antwort. Das ist nah an dem, was ich suche, aber ich muss in der Lage sein, die Eigenschaft zu setzen, anstatt sie nur abzurufen (siehe aktuelles Beispiel oben). Prost – John

Verwandte Themen