List Of in andere List Of konvertieren

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    List Of in andere List Of konvertieren

    Ich steh vor folgendem Problem und zwar habe ich eine Klasse die Public ist, alle Eigenschaften sind ReadOnly. Es gibt eine List Of die diese Klasse beinhaltet. Nun möchte ich intern eine ähnliche Klasse haben, die Read & Write zulässt. Nun möchte ich am Ende die List mit den Properties die Read & Write zulassen in eine List mit den Properies die nur Read zulässt konvertieren. Wie kann ich das realisieren?
    Wenn die Eigenschaften ReadOnly sind, sind die dann in der Klasse fest definiert? Oder wie bekommen die Eigenschaften den Return Wert.

    Also mir würde z.B. nur einfallen das alle Eigenschaften der Klasse in Sub New() gesetzt werden können, dann musste halt die ListOf wo R&W zugelassen ist druchgehen und deren Werte an eine neue Instanz der nur Read Klasse übergeben.
    Wie sollte das anders gehen wenn sie ReadOnly haben? Du musst aufjedenfall eine Funktion haben die die Variablen Zuweist.

    VB.NET-Quellcode

    1. Public Class ReadOnlyKlasse
    2. Private _Eigenschaft1 As String = "Hallo"
    3. Private _Eigenschaft2 As Boolean = False
    4. Private _Eigenschaft3 As Integer = 3
    5. Public ReadOnly Property Eigenschaft1() As String
    6. Get
    7. Return _Eigenschaft1
    8. End Get
    9. End Property
    10. Public ReadOnly Property Eigenschaft2() As Boolean
    11. Get
    12. Return _Eigenschaft2
    13. End Get
    14. End Property
    15. Public ReadOnly Property Eigenschaft3() As Integer
    16. Get
    17. Return _Eigenschaft3
    18. End Get
    19. End Property
    20. Public Sub SetValues(ByVal eig1 As String, ByVal eig2 As Boolean, ByVal eig3 As Integer)
    21. _Eigenschaft1 = eig1
    22. _Eigenschaft2 = eig2
    23. _Eigenschaft3 = eig3
    24. End sub
    25. End Class


    Anders gehts meiner Meinung nach nicht, weil es eben ReadOnly sind und die Variablen in der Klasse müssen ja irgendwie zugewiesen werden damit sie über die Property ausgegeben werden können.
    Hallo,

    nein das ist nicht mal nötig, wenn die Klasse in einer dll gespeichert wird und nur intern in der Assembly bearbeitet werden soll, dann muss man in C# die Set Funktion einfach auf Internal stellen entsprechend in VB sollte es Friend sein...oder du gewährst den Zugriff über Reflection, aber das ist natürlich nicht das wahre ;)

    Mfg jvbsl
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ..Oder so:

    VB.NET-Quellcode

    1. Public Class KP
    2. Dim wert1 As Integer = 123
    3. Dim wert1_rw As Boolean = False
    4. Public Sub New(RW As Boolean)
    5. wert1_rw = RW
    6. End Sub
    7. Public Property Wert
    8. Get
    9. Return wert1
    10. End Get
    11. Set (value As Integer)
    12. If wert1_rw then wert1 = value
    13. End Set
    14. End Property
    15. End Class

    VB.NET-Quellcode

    1. ' Read ist public, aber write nur protected!
    2. Public Property ID As Integer
    3. Get
    4. Return 1
    5. End Get
    6. Protected Set(ByVal value As Integer)
    7. End Set
    8. End Property


    Man kann Properties also mit zwei verschiedenen Modifizierern erstellen!
    Man kann Properties also mit zwei verschiedenen Modifizierern erstellen!

    Eben...

    Wenn das Ganze unbedingt mit zwei verschiedenen Klassen realisiert werden soll: Überlade in beiden Klassen den CType-Operator so, dass eine implizite Konvertierung möglich wird. Dann kannst du mit entsprechenden Methoden der List-Klasse (Cast?) deren Elemente umwandeln.
    Gruß
    hal2000
    Etwa so:

    VB.NET-Quellcode

    1. Class ClassA
    2. Public field As String
    3. Public Shared Widening Operator Ctype(in As ClassA) As ClassB
    4. Return New ClassB() With {.field = Int32.Parse(Me.field)}
    5. End Operator
    6. End Class
    7. Class ClassB
    8. Public field As Integer
    9. Public Shared Widening Operator Ctype(in As ClassB) As ClassA
    10. Return New ClassA() With {.field = Me.field.ToString()}
    11. End Operator
    12. End Class
    13. Module Test
    14. Sub Main()
    15. Dim l1 As New List(Of ClassA)
    16. 'l1 mit ClassA-Objekten füllen
    17. Dim l2 As List(Of ClassB) = l1.ConvertAll(Of ClassB)()
    18. End Sub
    19. End Module

    Nur ein Quick&Dirty-Beispiel - es kann sein dass du Narrowing statt Widening verwenden musst (ich verwechsele die beiden immer).

    EDIT: Mir fällt gerade auf, dass du für ConvertAll() eine Converter-Klasse bereitstellen musst. Damit werden die Operatorüberladungen überflüssig. Stattdessen musst du die Konvertierungsoperationen in der geforderten Klasse verwirklichen.

    Alternativ kannst du eine Erweiterungsmethode "Cast" selbst schreiben, die von den Operatorüberladungen Gebrauch macht:

    VB.NET-Quellcode

    1. Module Ext
    2. <Extension()> _
    3. Public Function Cast(Of TIn, TOut)(lst As List(Of TIn)) As List(Of TOut)
    4. Dim tmp As New List(Of TOut)
    5. For Each e As TIn In lst
    6. tmp.Add(Ctype(e, TOut))
    7. Next e
    8. Return tmp
    9. End Function
    10. End Module

    ~~so in etwa...
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()