Auf Möglichkeit zum Casten testen

13/09/2009 - 10:21 von Nico Wessels | Report spam
Hi NG;

in der MSDN sieht man öfter mal ein Beispiel, in dem der Programmfluss
über eine abgefangene Exception bestimmt wird. Zum Beispiel wird
versucht, ein Objekt auf einen bestimmten Typ zu casten, falls dabei
eine Exception auftritt, wird versucht auf einen anderen Typ zu casten.

Irgendwie kommt mir so eine Vorgehensweise vom Stil her nicht schön vor.

Wie kann man ich denn vor einem Cast schon mal prüfen, ob das Objekt dem
gewünschten Typ entpricht, so dass man es nicht zur Exception kommen
lassen muss?
 

Lesen sie die antworten

#1 Frank Dzaebel
13/09/2009 - 10:52 | Warnen spam
Hallo Nico,

Wie kann man ich denn vor einem Cast schon mal prüfen, ob das Objekt
dem gewünschten Typ entpricht, so dass man es nicht zur Exception
kommen lassen muss?



Da gibt es verschiedene Szenarien und Möglichkeiten.
Bei Tests zwischen kompatiblen *Referenztypen* zum Beispiel
eignet sich der "as" Operator, denn der ergibt null, wenn die
Typwandlung nicht möglich wàre. Ist er ungleich null, so
hat man bereits die Zuweisung an die Instanz durchgeführt
und kann das Objekt gleich weiter benutzen.

[as (C#-Referenz)]
http://msdn.microsoft.com/de-de/lib...sdfbt.aspx

[Gewusst wie: Sichere Umwandlung mit den Operatoren "as" und "is"]
http://msdn.microsoft.com/de-de/lib...88006.aspx
________

Beim "is" Schlüsselwort kann man feststellen, ob ein
Objekt mit einem bestimmten Typ kompatibel ist:

[is (C#-Referenz)]
http://msdn.microsoft.com/de-de/lib...kt9xw.aspx
________

Ggf. stellen die Typen auch Konverter zur Verfügung,
mit denen eine Umwandlung möglich ist. Dann ginge
es etwa in Richtung:

TypeConverter tc = TypeDescriptor.GetConverter(deinObjekt);
bool ok1 = tc.CanConvertTo(typeof(DeinTyp));
bool ok2 = tc.CanConvertFrom(typeof(DeinTyp));
________

In dynamischen Szenarien ist mitunter der Aufruf:
bool ok3 = typeof(DeinTyp).IsAssignableFrom(deinObjekt.GetType());
vorteilhaft.
________

Dann möchte ich noch kurz auf die:

[Convert-Klasse (System)]
http://msdn.microsoft.com/de-de/lib...nvert.aspx

aufmerksam machen. Diese wird u.a. gern in generischen Kontexten
eingesetzt. Auch gibt es Möglichkeiten über Linq Expressions.
________

Hier ein wenig zusammenfasst:

[Umwandlung und Typkonvertierungen (C#-Programmierhandbuch)]
http://msdn.microsoft.com/de-de/lib...73105.aspx
_________

Die Möglichkeit über try-catch ist natürlich
nicht empfohlen.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen