none
PropertyInfo und GetValue eines Arrays RRS feed

  • Frage

  • Mahlzeit zusammen,

    ich benötige eure Hilfe. Los geht's!

    Um die Werte einer Klasse in eine CSV-Datei zu schreiben, arbeite ich mit PropertyInfo. Den Code habe ich irgendwo gefunden. Zugegebener maßen verstehe ich ihn nicht so ganz. Grundlegend funktioniert dieser aber, Zunächst der Code:

    Private Sub SaveFiltertemplates()
            Try
                Using _sw As New IO.StreamWriter("Filtertemplates.txt", False, System.Text.Encoding.Default)
                    For Each Template As clsFiltertemplates In TemplatesStack
                        Dim _sSpeicherstring As String = ""
    
                        Dim Type As Type = Template.GetType()
                        Dim properties() As PropertyInfo = Type.GetProperties()
    
                        For Each obj As PropertyInfo In properties
                            If _sSpeicherstring = "" Then
                                _sSpeicherstring = obj.GetValue(Template, Nothing).ToString
                            Else
                                If TypeOf (obj.GetValue(Template, Nothing)) Is Array Then
                                    _sSpeicherstring += ";" & String.Join("#+", obj.GetValue(Template, Nothing).ToString)
                                Else
                                    _sSpeicherstring += ";" & obj.GetValue(Template, Nothing).ToString
                                End If
                            End If
                        Next
                        _sw.WriteLine(_sSpeicherstring)
                    Next
                End Using
            Catch
                MsgBox("Die Templates konnten nicht abgespeichert werden. Überrüfen Sie, ob 'Filtertemplates.txt' anderweitig geöffnet ist.", Nothing, "Fehler beim Abspeichern...")
            End Try
        End Sub

    Jetzt musste ich in die Klasse eine Property vom Typ String in den Typ String() (also ein Array) abändern.

    obj.GetValue(Template, Nothing).ToString

    funktioniert damit nicht mehr. Also checke ich, ob die Property ein Array ist und gehe damit anders vor, in dem ich das Array mit dem Delimiter #+ in den Semikolongetrennten String mit einbaue. Versuchen tu ich es hier:

    If TypeOf (obj.GetValue(Template, Nothing)) Is Array Then
        _sSpeicherstring += ";" & String.Join("#+", obj.GetValue(Template, Nothing))
    Else
        _sSpeicherstring += ";" & obj.GetValue(Template, Nothing).ToString
    End If

    Allerdings bekomme ich die einzelnen Werte dieses Arrays nicht ausgelesen. Auch längere Suche im Netz hat mir nicht weiter geholfen. Wie lässt sich mein Vorhaben bewerkstelligen?

    Vielen Dank euch!

    Grüße
    Manu


    • Bearbeitet mmkeys2 Mittwoch, 27. September 2017 15:07 fehle etwas
    Mittwoch, 27. September 2017 15:06

Antworten

  • Hey,

    der Rückgabewert von obj.GetValue() ist object. Du musst es noch in ein string[] casten.

    String.Join("#+", CType(obj.GetValue(Template), String()))

    Beste Grüße

    P.S.: Der Code, den du da gefunden hast, arbeitet mit Reflection. Für nähere Informationen dazu siehe hier.


    Vergiss nicht, die Antwort auf deine Frage zu markieren und hilfreiche Beiträge zu bewerten, damit auch andere schnell die Lösung für ihr Problem finden können - und wir nebenbei noch ein paar Punkte verdienen. :)

    Mittwoch, 27. September 2017 15:54