Avatar billede mrbonus Novice
25. august 2006 - 08:57 Der er 11 kommentarer og
1 løsning

Typecast af object

Jeg har lavet en "Users" klasse og en "Instructor" klasse, "Instructor" nedarver fra "Users", nå har jeg så et array med 2 "Instructor"'s, men de ligger i et array af "Users".

Jeg vil så typecaste dem til instructors, men den vil ikke lade mig gøre således

CType(usersArr, Instructor())

hvad skal man så gøre??
Avatar billede erikjacobsen Ekspert
25. august 2006 - 09:08 #1
Dvs. det her brokker den sig over

  dim u_arr as users()
  dim i_arr as instructor()
  i_arr = ctype(u_arr,instructor())

?
Avatar billede mrbonus Novice
25. august 2006 - 09:37 #2
ja
Avatar billede mrbonus Novice
25. august 2006 - 09:37 #3
Jeg kontrollerede i debug mode at det var instructrs der lå i userarrayet
Avatar billede mrbonus Novice
25. august 2006 - 09:38 #4
Bør vist hellere sige at jeg benytter VS 2005 ASP.NET
Avatar billede mrbonus Novice
25. august 2006 - 09:44 #5
Min Instructor starter således

Public Class Instructor
    Inherits Users


Exceptionen kommer her.

System.InvalidCastException was unhandled by user code
  Message="Et objekt af typen 'Users[]' kan ikke konverteres til typen 'Instructor[]'."
  Source="App_Code.yrspqsdo"
  StackTrace:
      ved UserController.getAllInstructors() i C:\Documents and Settings\rkure\Dokumenter\Visual Studio 2005\WebSites\DGM_Training\App_Code\UserController.vb:linje 56
      ved ManageCourse.initInstructorDropDownList() i C:\Documents and Settings\rkure\Dokumenter\Visual Studio 2005\WebSites\DGM_Training\ManageCourse.aspx.vb:linje 49
      ved ManageCourse.Page_Load(Object sender, EventArgs e) i C:\Documents and Settings\rkure\Dokumenter\Visual Studio 2005\WebSites\DGM_Training\ManageCourse.aspx.vb:linje 18
      ved System.EventHandler.Invoke(Object sender, EventArgs e)
      ved System.Web.UI.Control.OnLoad(EventArgs e)
      ved System.Web.UI.Control.LoadRecursive()
      ved System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Avatar billede mrbonus Novice
25. august 2006 - 09:47 #6
Dim u_arr(1) As Users
        u_arr(0) = New Instructor()
        u_arr(1) = New Instructor()
        Dim i_arr As Instructor()
        i_arr = CType(u_arr, Instructor())

Dette giver samme exception, men først når jeg vil typecaste, det giver ingen problemer at gemme instructorne i userarrayet
Avatar billede arne_v Ekspert
25. august 2006 - 13:18 #7
du bliver nødt til as caste de enkelte elementer til Instructor når du bruger dem
Avatar billede mrbonus Novice
27. august 2006 - 09:22 #8
Så det du siger er at man kun kan typecaste en ad gangen?
Avatar billede arne_v Ekspert
28. august 2006 - 04:38 #9
ja
Avatar billede erikjacobsen Ekspert
28. august 2006 - 11:20 #10
Jeg fik ikke vendt tilbage til spørgmålet i fredags - eller i weekenden. Det jeg ville, var at afprøve en konstruktion i .NET 2.0, jeg ikke havde forsøgt mig med før, som "gør arbejdet" for een, og som er typestærk. Nedenstående er en lille windows-applikation, der illustrerer metoden ConvertAll:

Public Class Form1

    Public Shared Function cc(ByVal u As Users) As Instructor
        cc = CType(u, Instructor)
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim u_arr(1) As Users
        u_arr(0) = New Instructor()
        u_arr(1) = New Instructor()
        Dim i_arr As Instructor()
        i_arr = Array.ConvertAll(u_arr, New Converter(Of Users, Instructor)(AddressOf cc))
    End Sub
End Class

Public Class Users
    Public u As Int32
End Class

Public Class Instructor
    Inherits Users
    Public i As int32
End Class
Avatar billede mrbonus Novice
28. august 2006 - 12:46 #11
Ja, ser interessant ud, men så er det lige før at man bare selv kan løbe dem igennem i en løkke er det ik?

Jeg mener, at når man alligevel skal lave ekstra kode, og jeg gætter på at det tager ca lige lang tid, om man bruger convert all eller løber igennem en for løkke, for det gør convertall også som det ses nedenfor.

public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter)
{
      if (array == null)
      {
            throw new ArgumentNullException("array");
      }
      if (converter == null)
      {
            throw new ArgumentNullException("converter");
      }
      TOutput[] localArray1 = new TOutput[array.Length];
      for (int num1 = 0; num1 < array.Length; num1++)
      {
            localArray1[num1] = converter(array[num1]);
      }
      return localArray1;
}
Avatar billede erikjacobsen Ekspert
28. august 2006 - 13:01 #12
Jo, men ConvertAll er typestærk, og brokker sig hvis der er noget, der ikke passer (Og nu er det vb.net, så du har vel både "option explicit on" og "option strict on").
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester