Announcement

Collapse
No announcement yet.

C#: Klassen aulisten?

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

  • C#: Klassen aulisten?

    Hallo zusammen

    Ich habe in C# einen belibigen Klasserstellt, und in dieses Klass sind auch noch weitere andere Klassen. Besteht jtzt die möglichkeit alle unter Klassen von einem Klass auflisten?

    Wenn ja, welche Begriffe sollte ich mir genauer anschauen?

    Freundliche Grüsse

    user.NET

  • #2
    Ja, es geht, aber "natürlich" ziemlich umständlich:
    Code:
             MyClass myObject = new MyClass();
             MemberInfo[] myMemberInfo; 
    
             // Get the type of 'MyClass'.
             Type myType = myObject.GetType(); 
            
             // Get the information related to all public member's of 'MyClass'. 
             myMemberInfo = myType.GetMembers();
    //  und ab jetzt braucht man viele Fallunterscheidungen für die "nested classes"
    Zur weiteren Untersuchung siehe auch das Beispiel unter Type.GetMembers-Methode in der SDK-Doku, woher ich den Code kopiert habe. Jürgen

    Comment


    • #3
      Vielen Dank für deine Antwort.

      Nun habe ich auch noch eine andere Frage der mehr oder weniger in dieser Richtung geht:

      Ich habe belibige Objecte (TextBox, Label, Button etc.). Alle diese Objekte haben einen Click ereigniss (Click ereigniss zeigt immer auf die gleiche Funktion). Mit GetType sehe ich ja auf welches Object geklickt wurde.

      Jetzt könnte ich folgendes tun:

      Code:
      if(sender.GetType().ToString() == "System.Windows.Forms.TextBox"){
      TextBox tmpObject= new TextBox();
      }
      else if(sender.GetType().ToString() == "System.Windows.Forms.Label"){
      Label tmpObject= new Label();
      }
      Nun möchte ich wissen wie ich das Automatisieren kann? Also gibt es einen direkten Weg dafür ohen if und else brauchen zu müssen?

      Irgend so etwas stelle ich mir vor:

      Code:
      sender.GetType().BLABLA tmpObject = new sender.GetType().BLABLA();
      Besten Dank für die Hilfe, ist echt toll hier.

      Comment


      • #4
        Hallo,

        was und wie es gemacht werden kann oder soll, hängt davon ab, was Du anschließend damit machen willst. Deine letzte Idee ist auf jeden Fall Quatsch, weil dabei mit "new" immer ein neues Objekt erzeugt wird.

        Wenn es Dir auf den Unterschied zwischen TextBox und Label nicht ankommt, kannst Du den gemeinsamen Vorfahren verwenden:
        Code:
        Control myObject = sender as Control;
        Wenn es Dir auf den Unterschied ankommt, musst Du mit if/else unterscheiden; es geht etwas kürzer anstelle der Typunterscheidung mit Strings:
        Code:
        if(sender is TextBox){
            TextBox tmpObject = sender as TextBox;
        }
        else if(sender is Label){
            Label tmpObject = sender as Label;
        }
        Diese Variablen darfst Du dann natürlich nur innerhalb des jeweiligen if-Zweigs verwenden, weil sie nur lokal gelten.

        Jürgen

        Comment


        • #5
          Deine letzte Idee ist auf jeden Fall Quatsch, weil dabei mit "new" immer ein neues Objekt erzeugt wird.

          Das ist ja genau mein Ziel (vom gleichen Object ein neues erzeugen und das Object in einem TabPad einfügen und den ganzen TabPad zurückgeben)

          Es wäre eben viel einfacher, wenn ich die if und else schleife nicht schreiben müsste!

          Comment


          • #6
            Originally posted by user.Net View Post
            Das ist ja genau mein Ziel (vom gleichen Object ein neues erzeugen und das Object in einem TabPad einfügen und den ganzen TabPad zurückgeben)
            Oh, mit so etwas hatte ich überhaupt nicht gerechnet. Entschuldige!

            Es geht mit Activator.CreateInstance, wird aber trotzdem kompliziert.
            Code:
            //  benötigten Typ bestimmen
            Type type = sender.GetType();
            //  diesen Typ erzeugen
            Object obj = Activator.CreateInstance(type);
            
            //  bei unterschiedlicher Verwendung kann danach konvertiert werden:
            if (obj is TextBox) {
                TextBox box = obj as TextBox;
            }
            Das ist jetzt sehr verkürzt dargestellt. Vor allem muss der Typ geprüft werden; u.U. müssen die Assembly und der FullName des Typs einbezogen werden.

            Jürgen

            Comment


            • #7
              Danke Jürgen

              Ich Danke dir Jürgen, dass hat mir jetzt weiter geholfen.

              Comment


              • #8
                Bitte mache das Forum nicht unübersichtlich. Deine neue Frage hat nur sehr indirekt etwas mit "Klassen auflisten" zu tun. Bitte lösche sie und beginne eine neue Diskussion mit der richtigen Überschrift. (Deshalb gibt es von mir auch keine sachliche Antwort.) Jürgen

                Comment

                Working...
                X