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
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.
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Hallo Flohen,
Um mit einem unbekannten Typ zu arbeiten gibt es System.Type.
An ein Type-Objekt zukommen gibt es mehrere wege:
2 ist für deinen Konkreten Fall unbrauchbar, aber mit 1 und 3 solltest du weiter kommen.
Gruß
Juy Juka
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);
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.
Danke, danke, ich hab grad gesehen, das PropertyInfo eine Funktion SetValue hat...damit klappt's.
Nochmal vielen Dank.
Greetz
Flohen
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 😉
@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
Hi,
wenn ich mit "is" geprüft habe, könnte ich natürlich auch direkt Casten
...
TextBox tb = (TextBox)o;
...
Ciao:
GG 😉
Ciao:
GG 😉
Du kannst aber auch direkt ein "as" verwenden und anschließend auf Null prüfen.
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 |
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...
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?!?
Jop, is mir schon klar.
Aber ne TextBox hat kein SelectedItem, dafür ne ComboBox, ne ListBox etc.
Das mein ich mit gruppieren...
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 |
@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.
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... 😉
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.
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... 😉
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.