| |

VB.NET - Ein- und UmsteigerGenerische Klasse und ihre Tüken | |  | Autor: Madis82 | Datum: 28.04.09 09:35 |
| Hallo zusammen,
Anfangs war ich mit meiner neuen Aufgabe und meinem bis Dato Halbwissen was VB.net angeht eher euphorisch. Doch mittlerweile stelle ich alles in Frage was ich bisher gelernt habe. Mein Aktuelles Problem:
Ich habe eine generische Listen Klasse gebaut, welche wie eine List, Objekte anlegen und wieder ausgeben kann, zusätzlich möchte ich noch die aktuellen Objekte pro Typ in einer XML Datei speichern.
So sieht die aktuelle Klasse so aus:
Public Class GenericProperty_Class(Of MasterData As New)
Implements IEnumerable
Private _Count As Integer
Private Const _defaultCapacity As Integer = 1
Private Shared _emptyArray As MasterData()
Private _items As MasterData()
Private _size As Integer
Shared Sub New()
GenericProperty_Class(Of MasterData)._emptyArray = New MasterData(0 - _
1) {}
End Sub
Public Sub New()
'Dim locItem As New MasterData
Me._items = GenericProperty_Class(Of MasterData)._emptyArray
End Sub
Public Sub New(ByVal capacity As Integer)
If (capacity < 0) Then
'ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity,
' ExceptionResource.ArgumentOutOfRange_SmallCapacity)
Else
Me._items = New MasterData(capacity - 1) {}
End If
End Sub
'Liefert die Anzahl der vorhandenen Elemente zurück
Public Overridable ReadOnly Property Count() As Integer
...
End Property
'Erlaubt das Zuweisen
Default Public Overridable Property Item(ByVal Index As Integer) As MasterData
...
End Property
Public Property Capacity() As Integer
...
End Property
#End Region
'Add
Public Sub Add(ByVal Item As MasterData)
If Me._size = Me._items.Length Then
Me.EnsureCapacity(Me._size + 1)
End If
Me._items(Me._size) = Item
Me._size += 1
End Sub
'EnsureCapacity
Private Sub EnsureCapacity(ByVal min As Integer)
If (Me._items.Length < min) Then
Dim num As Integer
If (Me._items.Length = 0) Then
num = 1
Else
num = (Me._items.Length * 2)
End If
If (num < min) Then
num = min
End If
Me.Capacity = num
End If
End Sub
'ForEach
Sub ForEach(ByVal action As Action(Of MasterData))
If (action Is Nothing) Then
'ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match)
End If
Dim i As Integer
For i = 0 To Me._size - 1
action.Invoke(Me._items(i))
Next i
End Sub
'GetEnumerator
Public Function GetEnumerator() As System.Collections.IEnumerator Implements _
System.Collections.IEnumerable.GetEnumerator
Dim locTempArray(_Count - 1) As MasterData
Array.Copy(_items, locTempArray, _Count)
Return locTempArray.GetEnumerator
End Function
'insert_Masterdata
Function insert_Masterdata() As MasterData
Dim locData As New MasterData
If locData IsNot Nothing Then
'...diese dieser Auflistung hinzufügen.
Me.Add(locData)
'True zurückliefern, damit die aufrufende Instanz weiß, dass
'es die Liste aktualisieren muss, um die Änderungen widerzuspiegeln.
Return locData
End If
'Keine Änderung
Return Nothing
End Function
Public Sub XMLSerialize(ByVal Dateiname As String)
Dim locXmlWriter As New XmlSerializer(GetType(GenericProperty_Class(Of _
MasterData)))
Using locXmlDatei As New StreamWriter(Dateiname)
locXmlWriter.Serialize(locXmlDatei, Me)
locXmlDatei.Flush()
locXmlDatei.Close()
End Using
End Sub
Public Shared Function XmlDeserialize(ByVal Dateiname As String) As _
GenericProperty_Class(Of MasterData)
Try
Dim locXmlLeser As New XmlSerializer(GetType(GenericProperty_Class(Of _
MasterData)))
Using locXmlDatei As New StreamReader(Dateiname)
Return CType(locXmlLeser.Deserialize(locXmlDatei), GenericProperty_Class(Of _
MasterData))
End Using
Catch ex As Exception
MessageBox.Show("Fehlerbeschreibung: " + ex.Message, "Datenermittlung" & _
"Fehlgeschlagen", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return Nothing
End Try
End Function
End Class Ich weiß viele werden jettzt wahrscheinlich die Hände über den Kopfschlagen und sagen was machst du denn da, aber vielleicht spiegelt das wirklich aktuell mein Seelendasein wieder.
Naja beim Aufruf des XmlDeserialize bekomme ich die Melden "InvalideOperationException" in welcher mit mitgeteilt wird, dass wenn ich von IEnumerable erbe ich die Add Methode nicht implementiert habe, aber warum? Ich habe doch eine Add Methode welche er erkennen muss oder?
Zudem habe ich das Problem, dass wenn ich ein Objekt Instanziiere dieses laut ÜberwachungsMonitor die Länge 0 hat, aber im Grunde wie Nothing behandelt wird. Was muss ich tun, um eine generische Klasse richtig zu Instanziieren?
Ich glaube ich muss euch nicht sagen wie Dankbar ich wäre, wenn mich jemand über die Tüken von generischen Klassen aufklären würde.
Viele Grüße
Madis |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevISDN 1.0 
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevAniGif (VB/VBA) 
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|