Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 9 von 9
  1. #1
    Stammgast
    Registriert seit
    08.10.2009
    Beiträge
    113

    Standard String in Klasse umwandeln

    Hallo!
    Ich habe folgendes Problem:
    Ich möchte in meiner Anwendung in einer Textbox den Namen einer Klasse angeben, und dann aufbauend von dem Namen der Klasse eine neue Instanz erstellen. Ich möchte also den namen der Klasse variabilisieren. Geht das?

    Also normalerweise ist das ja so:
    Dim varclass as new meineKlasse

    Und nun möchte ich den Namen der Klasse aus einer textbox lesen, also in etwa so:
    Dim varclass as new textbox1.text

    Wahrscheinlich muss ich aber irgendwie mitteilen, dass der String der Name einer Klasse ist, oder?

    Geht das? Wenn ja, wie?
    Mir fehlt mal wieder der passende Begriff, sonst hätte ich Freund google bereits gefragt.

    Danke

  2. #2
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.324

    Standard

    Code vb.net:
    Dim varclass As Object = Activator.CreateInstance(Type.GetType(textbox1.text))

    Natürlich muss dann der Inhalt von textbox1.text auch ein gültiger Klassenname (also inklusive Namespace) sein. Und die Assembly in dem die Klasse sich befindet muss natürlich auch geladen sein.

  3. #3
    Stammgast
    Registriert seit
    24.11.2012
    Beiträge
    293

    Standard

    mmh...
    nur mal so aus Interesse:
    Wie willt du denn dann auf die Methoden und Eigenschaften deines Objekts zugreifen (bzw was willst du erreichen), wenn du nicht weisst was du da instanziert hast?

    Würd' mich mal interessieren...

  4. #4

    Standard

    Reflection
    Geändert von Christian Marquardt (03.01.2013 um 07:14 Uhr)
    Christian

  5. #5
    Stammgast
    Registriert seit
    24.11.2012
    Beiträge
    293

    Standard

    ok, klar .... nur mal so angenommen... das ist ja ein Textfeld, da geb ich dann z.B. ein "application.excel" oder was mir sonst gerade einfällt... würd mich halt interessieren, was SQL-Rookie da interessantes vorhat. Ich benutze VB schon lange nicht mehr, aber meist kommt es da ja schon aus der pragmatischeren Ecke... (in einer Java Diskussion würd ich nicht Fragen ... die machen sowas weil..... , na weil sie es können halt )

  6. #6
    Stammgast
    Registriert seit
    08.10.2009
    Beiträge
    113

    Standard

    @ Ralf Jansen:
    Vielen Dank für den Lösungsvorschlag, auch dafür, dass es so schnell geht. In diesem Forum wird man auch als kleiner Hobbyprogrammierer mit einfachen Fragen immer freundlich behandelt. Danke. Ich probier das heute mal aus.

    Zitat Zitat von tömmel Beitrag anzeigen
    mmh...
    nur mal so aus Interesse:
    Wie willt du denn dann auf die Methoden und Eigenschaften deines Objekts zugreifen (bzw was willst du erreichen), wenn du nicht weisst was du da instanziert hast?

    Würd' mich mal interessieren...
    Was ich damit vorhabe?

    Nun, in unserer Vereins-Anwendung habe ich verschiedene devexpress-Reports erstellt. Die Reports sollen aber nicht mit der Anwendung verteilt werden, sondern in einer Datenbank gespeichert werden. Die Reports werden über eine separate Anwendung erstellt und auch über diese Anwendung auf den Server geladen.
    Das mache ich so:

    Code:
            Dim report As New reportmitgliederliste
            Dim isstd As Integer = 0    
            Dim isactive As Integer = 1    
            Dim art As String = "Liste"  
            Dim bez As String = "Mitgliederliste"
         
           
    
    
            ' Save the report to a stream.
            Dim stream As New MemoryStream()
            report.SaveLayout(stream)
    
            ' Prepare the stream for reading.
            stream.Position = 0
    
    
            Dim s As String
    
            ' Insert the report to a database.
            Using sr As New StreamReader(stream)
                ' Read the report from the stream to a string variable.
                s = sr.ReadToEnd()
            End Using
    
    
            Dim ssql As String = "INSERT INTO tblREPORTS ..."
    
            Dim connreport As New SqlConnection
            connreport.ConnectionString = myconnectionstring
    
            Dim cmd As SqlCommand = New SqlCommand(ssql, connreport)
            ...
    
            Try
    
                If connreport.State <> ConnectionState.Open Then connreport.Open()
    
    
                cmd.ExecuteNonQuery()
    
                connreport.Close()
    
            Catch ex As Exception
    
                MessageBox.Show(ex.Message.ToString(), "Fehler")
    
                Exit Sub
    
            End Try
    Und genau um die erste Zeile des Codes geht es.
    Ich möchte einfach über eine Textbox den Namen der Report-Klasse variabel eingeben (neben den anderen Parametern), und dann wird der Report in die Datenbank geladen.

    Daher brauche ich mir auch keine Gedanken um Eigenschaften und Methoden der Klasse zu machen. Es geht nur ums Hochladen.

    Vielleicht denke ich auch zu komliziert und es gibt einfachere Möglichkeiten, aber ich mach das ja nur hobbymäßig, und gehe da ganz pragmatisch ran.

  7. #7
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.324

    Standard

    @Tömmel: Du hast recht solange die zu ladende Klasse völlig beliebig ist kommt da nur sehr unwahrscheinlich was sinnvolles bei raus. Die Powershell wäre ein sinnvolles Beispiel eines Systems wo man beliebige .Net Klassen laden und verwenden kann.
    Hier ist es ein Report die also vermutlich eine eindeutige Basisklasse darstellt. Man müsste den Report also nicht wie ein Object verwenden wie von mir gezeigt sondern kann zumindest die eindeutige Oberfläche der Basisklasse verwenden.
    Und das ist auch genau der Grund warum dieses Verfahren(bzw. ähnliche) intensiv in Java, C# etc verwendet wird. Um in einer Anwendung konfigurativ die konkrete Implementierung einer Klasse austauschen zu können. In der Anwendung wird nur gegen ein Interface (oder Basisklasse) programmiert die dann zur Laufzeit durch eine konkrete Klasse ~unterfüttert~ wird. Viele Anwendungsframeworks, z.B das bekannte Spring in Java oder Unity, Castle Windsor etc. in .Net, sind um diese Idee herum entwickelt. Dort kommt die konkret zu verwendende Klasse dann halt nicht aus einer Textbox sondern aus irgendeiner Form von Konfiguration die ein Mapping von (Interface,Basisklasse,ID etc.)<->konkrete Klasse enthält. Es gibt da aber einige Patterns die sich gezielt dieser Problematik annehmen z.B. Service Locator, Inversion Of Control, Dependency Injection.

  8. #8
    Stammgast
    Registriert seit
    08.10.2009
    Beiträge
    113

    Standard

    Zitat Zitat von Ralf Jansen Beitrag anzeigen
    @Tömmel: Du hast recht solange die zu ladende Klasse völlig beliebig ist kommt da nur sehr unwahrscheinlich was sinnvolles bei raus. Die Powershell wäre ein sinnvolles Beispiel eines Systems wo man beliebige .Net Klassen laden und verwenden kann.
    Hier ist es ein Report die also vermutlich eine eindeutige Basisklasse darstellt. Man müsste den Report also nicht wie ein Object verwenden wie von mir gezeigt sondern kann zumindest die eindeutige Oberfläche der Basisklasse verwenden.
    Und das ist auch genau der Grund warum dieses Verfahren(bzw. ähnliche) intensiv in Java, C# etc verwendet wird. Um in einer Anwendung konfigurativ die konkrete Implementierung einer Klasse austauschen zu können. In der Anwendung wird nur gegen ein Interface (oder Basisklasse) programmiert die dann zur Laufzeit durch eine konkrete Klasse ~unterfüttert~ wird. Viele Anwendungsframeworks, z.B das bekannte Spring in Java oder Unity, Castle Windsor etc. in .Net, sind um diese Idee herum entwickelt. Dort kommt die konkret zu verwendende Klasse dann halt nicht aus einer Textbox sondern aus irgendeiner Form von Konfiguration die ein Mapping von (Interface,Basisklasse,ID etc.)<->konkrete Klasse enthält. Es gibt da aber einige Patterns die sich gezielt dieser Problematik annehmen z.B. Service Locator, Inversion Of Control, Dependency Injection.
    Also, ich hab jetzt rein gar nichts davon verstanden. Aber ich probier das mal aus, wie oben gezeigt.

  9. #9
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.324

    Standard

    Ging ja auch an Tömmel weil er allgemeines Interesse gezeigt hat

    Für dich Stand da nur zwischen den Zeilen das du nicht object verwenden solltest sondern die Basisklasse deiner Reports. Also vermutlich XtraReport.

    Code vb.net:
    Dim report As XtraReport = CType(Activator.CreateInstance(Type.GetType(MeinLieberReportName)), XtraReport)

    Edit: Hab mir mal die Doku zum Reporter angeguckt. Vergiss das mit dem Activator. Ein XtraReport hat SaveLayout/LoadLayout/FromStream Methoden die mit einen Stream in einem speziellen Report Format umgehen können. Die solltest du auch einfach benutzen. Gerade das Beispiel in FromStream zeigt doch wie das funktioniert. Mußt halt ~nur~ die Session durch deine Datenbank ersetzen.
    Geändert von Ralf Jansen (03.01.2013 um 13:32 Uhr)

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •