vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Generische 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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Generische Klasse und ihre Tüken1.622Madis8228.04.09 09:35
Re: Generische Klasse und ihre Tüken1.103ModeratorDaveS28.04.09 10:21
Re: Generische Klasse und ihre Tüken954Madis8228.04.09 11:57
Re: Generische Klasse und ihre Tüken1.008ModeratorDaveS28.04.09 12:09

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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