2017-03-22 6 views
0

Wenn ich ein neues Objekt der Klasse erschaffe und seine Eigenschaften Werte zuweisen wie folgt:Zugang zu neuen Klasse Eigenschaften des Objekts

foreach (var item in lstOfPersonnel) 
{ 
    ClassNameVM personVM = new ClassNameVM() 
    { 
     Name = item.FirstName + " " + item.LastName, 
     TimeTotalPFID = lstSummaries.Where(x => x.PFID == item.ID).Sum(x => x.Time), 
     TimeTotalPNFID = lstSummaries.Where(x => x.PNFID == item.ID).Sum(x => x.Time), 
     TimeTotalVO = lstSummaries.Where(x => x.VO == item.ID).Sum(x => x.Time), 
     TotalTime = // trying to do TimeTotalPFID + TimeTotalPNFID + TimeTotalVO.. but I can't access those properties. 
    }; 

    newListPersonnel.Add(personVM); 
} 

Wie greife ich auf die TimeTotalPFID, TimeTotalPNFID, TimeTotalVO Eigenschaften innerhalb des Objekts selbst?

+0

Sie kann nicht, wenn Sie auf diese Weise tun. Sie müssen die Objekterstellung und die Eigenschaftszuweisung trennen –

+0

@AkshayMahajan, das ist die Art und Weise, wie ich als nächstes versuchen würde, aber ich dachte, ich würde fragen, ob jemand dies getan hat –

+0

Ich habe das einmal versucht, war aber nicht erfolgreich –

Antwort

1

In diesem Fall, wenn Sie die gesamte Zeit nur die Summe aus anderen Eigenschaften wollen, dann tun Sie es nicht jedes Mal trainieren. Dies ist fehleranfällig und reagiert nicht korrekt, wenn sich die anderen Eigenschaften ändern. Beste in diesem Fall ist nur eine Eigenschaft, die nur ein get hat, die die Berechnung für Sie tut ...

public class ClassNameVM 
{ 
    /*other properties as normal */ 
    public int TotalTime 
    { 
     get { return TimeTotalPFID + TimeTotalPNFID + TimeTotalVO; } 
    } 
} 
+0

auch, andere Art von Syntax für Getter 'public int TotalTime => TimeTotalPFID + TimeTotalPNFID + TimeTotalVO;'. Danke für die Antwort. Sehr geschätzt! –

+1

Ah ja. Sehr richtig. Ich bin ein bisschen old school (womit ich meine, dass unser Build-Server immer noch eine ältere Version von C# benutzt und ich nicht alle diese neuen Syntaxen * schluchzen * benutzen kann). – Chris

6

Sie können nicht auf diese Eigenschaften zugreifen, da sie technisch im Rahmen dieses anonymen Objektaufrufs nicht existieren.

Betrachten Sie diese Eigenschaft auf der Zeile unter der Erklärung Einstellung:

ClassNameVM personVM = new ClassNameVM() 
{ 
    Name = item.FirstName + " " + item.LastName, 
    TimeTotalPFID = lstSummaries.Where(x => x.PFID == item.ID).Sum(x => x.Time), 
    TimeTotalPNFID = lstSummaries.Where(x => x.PNFID == item.ID).Sum(x => x.Time), 
    TimeTotalVO = lstSummaries.Where(x => x.VO == item.ID).Sum(x => x.Time), 
}; 

// Set your properties here 
personVM.TotalTime = personVm.TimeTotalPFID + personVM.TimeTotalPNFID + personVM.TimeTotalVO; 

Betrachten wir ein Constructor

Alternativ Sie einen Konstruktor definieren könnte, die in einem Parameter Ihrer item Art und Nutzung nehmen würde das:

public ClassNameVM(YourItemType item) 
{ 
    Name = item.FirstName + " " + item.LastName; 
    TimeTotalPFID = lstSummaries.Where(x => x.PFID == item.ID).Sum(x => x.Time); 
    TimeTotalPNFID = lstSummaries.Where(x => x.PNFID == item.ID).Sum(x => x.Time); 
    TimeTotalVO = lstSummaries.Where(x => x.VO == item.ID).Sum(x => x.Time); 
    TotalTime = TimeTotalPFID + TimeTotalPNFID + TimeTotalVO; 
} 

Welches würde Ihnen erlauben, einfacher zu verwenden:

foreach (var item in lstOfPersonnel) 
{ 
    newListPersonnel.Add(new ClassNameVM(item)); 
} 
+0

Ich mag die Konstrukteur-Idee, aber ich mag Chris Antwort in den Kommentaren! –

+1

Sein Vorschlag würde gut funktionieren. Sie haben nicht angegeben, dass Sie diese Eigenschaften nie verwenden (oder einfach nur verwenden, um die anderen Werte zusammenzufassen), also nahm ich an, dass sie notwendig waren. Sie könnten einfach 'TimeTotalVO = lstSummaries.Where (x => x.VO == Element.ID || x.PNFID == Element.ID || x.PFID == Element.ID) .Summe (x => x .Time) ' –

+0

Ich entschuldige mich für den Mangel an Klarheit. Ich habe dir allerdings eine positive Bewertung gegeben! –

3

einfachste Lösung wäre:

ClassNameVM personVM = new ClassNameVM() 
     { 
      Name = item.FirstName + " " + item.LastName, 
      TimeTotalPFID = lstSummaries.Where(x => x.PFID == item.ID).Sum(x => x.Time), 
      TimeTotalPNFID = lstSummaries.Where(x => x.PNFID == item.ID).Sum(x => x.Time), 
      TimeTotalVO = lstSummaries.Where(x => x.VO == item.ID).Sum(x => x.Time), 

     }; 
     personVM.TotalTime = personVM.TimeTotalPFID + personVM.TimeTotalPNFID + personVM.TimeTotalVO; 
Verwandte Themen