Extension List<OwnClass> Properties addieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Meister_Jup.

    Extension List<OwnClass> Properties addieren

    Servus zusammen,

    ich würde gerne in einer Extension von einer x-beliebigen List(of custom) eine Property addieren.

    Leider häng ich bei dem GetValue der Properties, glaube auch dass mein Ansatz falsch ist.
    Ich muss ja auf die Werte der Liste zugreifen, aber wie??

    Könnte mir da jemand bitte weiterhelfen?

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Addieren aller Integer-Werte einer List(of cumstom class)
    3. ''' <paramref name="PropertyName"/> Name der Property die Addiert werden soll
    4. ''' </summary>
    5. <Extension()>
    6. Function Get_Sum_of_Property(Of T)(ByVal source As List(Of T), PropertyName As String) As Double
    7. Dim tp As Type = source.GetType.GetGenericArguments()(0)
    8. Dim p As PropertyInfo = tp.GetProperty(PropertyName)
    9. Dim cf = p.GetValue(p) /<-- Fehler falsches Object
    10. End Function
    Du willst doch auf den Propertywert von den Listeinträgen zugreifen. Entsprechend sollte das z.B. p.GetValue(source[0]) heißen.

    Edit: Du kannst übrigens auch deutlich direkter auf die Properties von T zugreifen, weil du T ja schon so in der Methode verwenden kannst. Anstatt den Umweg über source zu gehen, kannst du direkt Dim tp = GetType(T) machen.

    VB.NET-Quellcode

    1. Private Sub Test()
    2. Dim source = New IO.DirectoryInfo("..").GetFiles.ToList
    3. Dim FileSum As Double = source.Get_Sum_of_Property("Length") ' würde ich nie benutzen, weil anders einfacher, korrekter, sicherer
    4. Dim FileSum2 As Long = source.Sum(Function(x) x.Length)
    5. End Sub
    6. <Extension()>
    7. Public Function Get_Sum_of_Property(Of T)(ByVal source As List(Of T), PropertyName As String) As Double
    8. Dim tp As Type = source.GetType.GetGenericArguments()(0)
    9. Dim p As PropertyInfo = tp.GetProperty(PropertyName)
    10. Return Aggregate x In source Select cf = CDbl(p.GetValue(x)) Into Sum(cf)
    11. End Function