Laden...

Ein Object in eine unbekannte Klasse konvertieren

Erstellt von Flohen vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.252 Views
F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren
Ein Object in eine unbekannte Klasse konvertieren

Hallo Community

Ich hab da ein Problem.

Ich habe zur Laufzeit ein object von dem ich nicht weiß was es ist.
Dazu habe ich in einem string den Typ des Objekts hinterlegt.

Ich bekomm also eine TextBox als object und im string steht "System.Windows.Forms.TextBox".

Gibt es eine Möglichkeit einen Cast oder eine Konvertierung zu machen, damit ich auf die Funktionen zugreifen kann? Fragt mich bitte nicht warum ich das so bekomme. Ich hab das nicht gemacht und muss es nur weiterentwickeln.

Gruß
Flohen

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Flohen,

Ich bekomm also eine TextBox als object und im string steht "System.Windows.Forms.TextBox".

Die TextBox bleibt eine TextBox - auch wenn du sie mit einer Variable vom Typ object referenzierst.
Somit würde dir ein solcher Cast gar nichts bringen - da du nicht weißt, was im string steht, könntest du danach auch nicht mehr mit der TextBox anfangen als zuvor.

Suchst du evtl. den Begriff Reflection?

Ansonsten müsstest du schon etwas genauer beschreiben, was du dir davon erhoffst.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Flohen,

ein Typ bleibt ein Typ. Das ist nicht möglich. Ich sehe eine Ähnlichkeit mit den Anonymous Types und den Dynamische Typen. Kannst du uns einen Grund nennen, warum du einen Typen/Objekt konvertieren möchtet?

zero_x

2.187 Beiträge seit 2005
vor 13 Jahren

Hallo Flohen,

Um mit einem unbekannten Typ zu arbeiten gibt es System.Type.
An ein Type-Objekt zukommen gibt es mehrere wege:

  1. Wenn du schon ein Objekt des Typs hast: Type type = <meinobjekt>.GetType();
  2. Wenn du den Typ kennst: Type type = typeof(<MeinTyp>);
  3. Wenn du den Namen des Typs hast: Type type = Type.GetType(nameAsString);

2 ist für deinen Konkreten Fall unbrauchbar, aber mit 1 und 3 solltest du weiter kommen.

Gruß
Juy Juka

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Mhhh, also erstmal vielen Dank für euren schnellen Antworten.

Wie ich den Type des objects rausbekomme das hab ich schon gewusst.
Aber ich kann dadurch nicht auf seine Funktionen bzw. die Member zugreifen.

Aber damit habe ich was anderes gefunden. Damit kann ich lesend auf eine Methode zugreifen.
Es gibt auch einen Klasse MemberInfo, damit könnte man sicher auch lesend auf einen Member zugreifen. Aber wie schreibend?

Hat das schon jemand von euch benutzt?


MethodInfo dynMethod = obj.GetType().GetMethod("EineMethodeDiesesObjekts", bindingFlags.NonPublic | BindingFlags.Instance);

ni = (int)dynMethod.Invoke(obj, null);

5.742 Beiträge seit 2007
vor 13 Jahren

Hat das schon jemand von euch benutzt?

Ja - das ist besagte Reflection.

Es gibt auch einen Klasse MemberInfo, damit könnte man sicher auch lesend auf einen Member zugreifen. Aber wie schreibend?

Schaue hierzu in die :rtfm: Doku; JuyJuka hat dir ja bereits einen Link genannt.

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Danke, danke, ich hab grad gesehen, das PropertyInfo eine Funktion SetValue hat...damit klappt's.

Nochmal vielen Dank.

Greetz
Flohen

G
75 Beiträge seit 2007
vor 13 Jahren

Wenn Dir die in Frage kommende Typen bekannt sind (s.o. TextBox), dann kannst Du sie doch einfach casten ohne mit Reflection herumzuzaubern:


        private string GetText(object o)
        {
            if (o is System.Windows.Forms.TextBox)
            {
                TextBox tb = o as TextBox;
                
                return tb.Text;
            }
            //else if (...)
            //{
            //    ...
            //}
            else
                throw new ArgumentOutOfRangeException();
        }

        [TestMethod]
        public void TestMethod2()
        {
            const string expected = "Beispiel";

            TextBox tb = new TextBox()
            {
                Text = expected,
            };

            object target = tb;

            Assert.AreEqual(expected, GetText(target));
        }

Ciao:
GG 😉

Ciao:
GG 😉

Gelöschter Account
vor 13 Jahren

@GG71:
Du hast prinzipiell recht. Allerdings ist es unnötig "is" und "as" gleichzeitig zu verwenden. Siehe auch: [Tipp] Casten aber richtig: Begriffe wie Cast / is / as

G
75 Beiträge seit 2007
vor 13 Jahren

Hi,

wenn ich mit "is" geprüft habe, könnte ich natürlich auch direkt Casten


...
    TextBox tb = (TextBox)o;
...

Ciao:
GG 😉

Ciao:
GG 😉

2.298 Beiträge seit 2010
vor 13 Jahren

Du kannst aber auch direkt ein "as" verwenden und anschließend auf Null prüfen.

Hinweis vor 13 Jahren

Ich habe den Link in die FAQ gepostet, damit das nicht nochmals durchgekaut wird. Also bitte wieder zurück zum thema

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Ja aber caste mal die kompletten WinForms...da hast ja 1000 Zeilen Switch Case...
Ist doch umständlich...und da die meistens selbe Attribute haben, muss man nur noch gruppieren. Das spart ne menge Zeilen Code.
Ob's performanter ist...keine Ahnung...

5.742 Beiträge seit 2007
vor 13 Jahren

Ist doch umständlich...und da die meistens selbe Attribute haben, muss man nur noch gruppieren. Das spart ne menge Zeilen Code.

Öhm - du bist dir schon bewusst, dass alle Steuerelemente von Control erben?!?

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Jop, is mir schon klar.

Aber ne TextBox hat kein SelectedItem, dafür ne ComboBox, ne ListBox etc.

Das mein ich mit gruppieren...

2.298 Beiträge seit 2010
vor 13 Jahren

Dort kannst du aber meines erachtens von ListControl ausgehen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

F
10.010 Beiträge seit 2004
vor 13 Jahren

@Flohen:

Ja aber caste mal die kompletten WinForms...da hast ja 1000 Zeilen Switch Case...

Was soll das denn werden?
Für mich hört sich das eher an als wenn die gesamte Architektur suboptimal ist.

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Nein nein, das hat mit einem Testprogramm zu tun. Wir möchten mit einem Programm andere Programme testen.
Ist ein wenig kompliziert und ehrlich gesagt, weiß ich selber noch nicht wie das am Ende aussehen soll...aber man hat anscheinend irgendeine Vorstellung... 😉

5.742 Beiträge seit 2007
vor 13 Jahren

Wir möchten mit einem Programm andere Programme testen.

Evtl. interessieren dich dann auch die CodedUITests in VS.
Alternativ ist vielleicht auch UI Automation interessant.

F
Flohen Themenstarter:in
86 Beiträge seit 2007
vor 13 Jahren

Danke, die Artikel sind sehr interessant. Aber so wie ich das verstanden habe, wollen sie nicht nur den Code testen, sondern auch die Bedienung.
Alles sehr komplex, ich versteh zumindest meistens Bahnhof. Bin halt ein Entwickler und kein Tester... 😉

F
10.010 Beiträge seit 2004
vor 13 Jahren

Dann wäre es doch billiger ein Tool einzukaufen.

Sowas wie Ranorex kann doch so ziemlich alles und ich bin sicher, das du es für das Geld nicht hinbekommen würdest.