Announcement

Collapse
No announcement yet.

String in Klasse umwandeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    [HIGHLIGHT=VB.NET]Dim varclass As Object = Activator.CreateInstance(Type.GetType(textbox1.tex t))[/HIGHLIGHT]

    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.

    Comment


    • #3
      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...

      Comment


      • #4
        Reflection
        Zuletzt editiert von Christian Marquardt; 03.01.2013, 08:14.
        Christian

        Comment


        • #5
          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 )

          Comment


          • #6
            @ 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.

            Originally posted by tömmel View Post
            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.

            Comment


            • #7
              @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.

              Comment


              • #8
                Originally posted by Ralf Jansen View Post
                @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.

                Comment


                • #9
                  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.

                  [HIGHLIGHT=VB.NEt]Dim report As XtraReport = CType(Activator.CreateInstance(Type.GetType(MeinLi eberReportName)), XtraReport)[/HIGHLIGHT]

                  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.
                  Zuletzt editiert von Ralf Jansen; 03.01.2013, 14:32.

                  Comment

                  Working...
                  X