none
Eigene DynamicArray Library: MissingMemberException bei Reverse() RRS feed

  • Frage

  • Hallo,

    ich habe eine DynamicArray Klasse geschrieben, in ihr wird ein normales Basic Array gespeichert, welches bei Inhaltsanpassungen mit ReDim neu initialisiert und von einem CachedArray die zuvor erhaltenen Werte zurückerhält (ist er kleiner, so viele wie möglich; ist er größer, alle und den Rest gleich Nothing).

    Nun habe ich eine Methode übersetzt namens Reverse(), es wird der Array in der DynamicArray Klasse Reversed, in einen DynamicArray übertragen und per Funktion returned.

    Doch bei jedem Aufruf der Reverse() Methode der DynamicArray Klasse erhalte ich eine MissingMemberException, woran könnte dies liegen?

    Grüße,

    Euer Joe (Joern Akkermann)

    Dienstag, 5. Januar 2016 22:11

Antworten

Alle Antworten

  • Hi,

    poste doch bitte mal den relevanten Code und prüfe, an welcher Stelle genau der Fehler auftritt.

    Wichtig wäre bspw. der Code deiner DynamicArray Klasse (vor allem die Deklaration, Inherits, Implements, usw. und natürlich auch deine Reverse Methode)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 5. Januar 2016 23:13
    Moderator
  • Die ganze DynamicArray Klasse:

    Public Class DynamicArray
        Public DynArray(0) As Object
    
        Sub New(length As Integer)
            ReDim DynArray(length)
            For counter = 0 To length
                DynArray(counter) = Nothing
            Next
        End Sub
    
        Sub New(ParamArray ByVal values() As Object)
            ReDim DynArray(values.Length() - 1)
            For counter = 0 To DynArray.Length - 1
                DynArray(counter) = values(counter)
            Next
        End Sub
    
        Default Public Property Access(ByVal index As Integer) As Object
            Get
                Return DynArray(index)
            End Get
            Set(value As Object)
                If index > DynArray.Length() - 1 Then
                    AddLength(index - DynArray.Length())
                End If
                DynArray(index) = value
            End Set
        End Property
    
        Sub AddLength(length As Integer)
            Dim CacheArray(DynArray.Length() - 1) As Object
            For counter = 0 To CacheArray.Length() - 1
                CacheArray(counter) = DynArray(counter)
            Next
            ReDim DynArray(CacheArray.Length() + length)
            For counter = 0 To CacheArray.Length() - 1
                DynArray(counter) = CacheArray(counter)
            Next
        End Sub
    
        Sub SubLength(length As Integer)
            ReDim DynArray(DynArray.Length() - 1 - length)
        End Sub
    
        Sub SetLength(length As Integer)
            If DynArray.Length < length Then
                AddLength(length - DynArray.Length - 1)
            Else
                ReDim DynArray(length)
            End If
        End Sub
    
        Sub Append(value As Object)
            AddLength(1)
            DynArray(DynArray.Length() - 1) = value
        End Sub
    
        Function Length() As Integer
            Return DynArray.Length()
        End Function
    
        Function Contains(value As Object) As Boolean
            Return DynArray.Contains(value)
        End Function
    
        Function Reverse() As Object
            Dim reverseDynArray = DynArray.Reverse().ToArray()
            Dim returnDynamicArray = New DynamicArray(0)
            For counter = 0 To reverseDynArray.Length() - 1
                returnDynamicArray(counter) = reverseDynArray(counter)
            Next
            Return returnDynamicArray
        End Function
    
        Function ToArray() As Array
            Return DynArray
        End Function
    End Class
    Das Problem
    Dim DynamicArrayOne = New DynamicArray(0)
    ' adding items to DynamicArrayOne
    Dim OneReverse = DynamicArrayOne.Reverse()
    System.MissingMemberException @ DynamicArrayOne.Reverse()







    Mittwoch, 6. Januar 2016 00:30
  • Habe jetzt ein Workaround, naja nicht die beste Lösung so ein Workaround.
    Mittwoch, 6. Januar 2016 08:09
  • Hallo Joern Akkermann,

    Würdest Du das Workaround näher beschreiben, weil es für künftige Leser des Threads, die auch dieses Problem umgehen möchten, hilfreich sein wird?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 6. Januar 2016 14:19
    Administrator
  • Hallo Joe,
    wie sieht denn dein Workaround aus? Wenn ich deinen Code in ein neues Projekt kopiere läuft er ohne Probleme.
    Wenn die Klasse in einer DLL liegt deutet die Exception darauf hin, dass diese nicht neu erstellt wurde und das Programm versucht die Funktion in der alten DLL aufzurufen. Hierbei sollte aber eigentlich auch der Compiler einen Fehler ausgeben.

    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 6. Januar 2016 15:01
    Moderator
  • Hallo Joern,

    abgesehen davon, das ein "Dynamisches Array" durch eine List(T) bereits wesentlich effizienter abgewickelt wird - und ich rate Dir dringend Dich mit den Standard-Auflistungen zu beschäftigen, anstatt solche Eigengewächse zu produzieren:

    Die Reverse Methode, die Du einsetzt, erfordert Enumrable.Reverse aus System.Linq. Was fehlschlagen kann, wenn man .NET 2.0 einsetzt, da die Methode erst ab 3.5 existiert.

    Und wenn man mit Option Strict Off unterwegs ist schlägt einem schon mal eine MissingMember Ausnahem um die Ohren wenn die VB "Intelligenz" am Ende ist.

    Abseits davon wäre die Implementation von Reverse effizienter implementiert als:

        Function Reverse2() As Object
            Dim reverseDynArray = New Object(DynArray.Length - 1) {}
            Array.Copy(DynArray, reverseDynArray, DynArray.Length)
            Array.Reverse(reverseDynArray)
            Return reverseDynArray
        End Function

    Was aber im Prinzip das dabei eingesetzt Array.Reverse alleine leisten könnte.

    Gruß Elmar

    Mittwoch, 6. Januar 2016 15:18
    Beantworter
  • Danke Elmar

    Thema Workaround:

    Ich habe die Reverse Methode nicht in die DynamicArray Klasse geschrieben, sondern in die Klasse in welcher ich diese brauche, bisher, danke für die vielen Antworten!

    Mittwoch, 6. Januar 2016 19:28