Entwickler-Ecke

C# - Die Sprache - Datentyp zur Laufzeit ermitteln


relapse - Mi 13.06.12 15:27
Titel: Datentyp zur Laufzeit ermitteln
Hallo! Meine Situation ist: Ich habe benutzerdefinierte Exceptions, alle von der Basisklasse Exception abgeleitet. Ich möchte aber alle Exceptions mit einer einzigen Error-Handling-Methode "bearbeiten", die dann einen Parameter vom Typ Exception bekommt. Wie kann ich dann zur Laufzeit feststellen von welchem Datentyp jeweilige Exception ist?


relapse - Mi 13.06.12 15:37

Ich glaube, ich hab' die Antwort gefunden:
http://social.msdn.microsoft.com/Forums/de/visualcsharpde/thread/5a6bcd7b-eebc-460b-93a4-55a9426831c5


Kha - Mi 13.06.12 16:08

In dem Fall würde ich doch eher is vorziehen :gruebel: ...


relapse - Fr 15.06.12 08:14

Welche Vorteile bringt das (außer kürzerer Schreibweise)?


KanneM - Fr 15.06.12 09:06

Meiner Meinung nach ist es schlicht das einfachste und effektivste. Allerdings benutze ich es auch nur für polymorphe Zwecke!


C#-Quelltext
1:
2:
3:
4:
5:
if(variable is int)
{
//Nicht zwingend notwendig, nur für bestimmte Aktionen
(variable as int).AKTION();
}


Natürlich muss die Variable vorher zugewiesen sein!

LG


Ralf Jansen - Fr 15.06.12 09:45

is unterstützt auch Ableitungen. Es testet also eher Zuweisbarkeit als Gleichheit. Zum Beispiel ein Test auf "is Object" würde immer true liefern. Ist in deinem Fall vermutlich geeigneter da wenn man explizit mit eigenen Exceptions arbeitet irgendeine Art von Hierarchie herausarbeitet und man dann so Fragestellung braucht wie 'ist dieses Exception eine ServerException oder ClientException' um danach erst denn konkreten Typ zu ermitteln. Wenn man nur auf Namensgleichheit der Typen testet ist man da eingeschränkt.


relapse - Fr 15.06.12 09:53

Danke an Alle!

Wieder was dazu gelernt. :shock:


Th69 - Fr 15.06.12 12:19

Kurzer Hinweis von mir bzgl. is und as:
dies funktioniert nur bei Referenztypen (also nicht bei Wertetypen wie in dem obigen Beispiel int).
Wenn man sowieso den konkreten Datentypen braucht, sollte man jedoch statt is und anschließendem 'casten' gleich as verwenden (und dann auf null prüfen!):

C#-Quelltext
1:
2:
3:
4:
5:
6:
ArgumentException argex = e as ArgumentException;
if (argex != null)
{
  string paramName = argex.ParamName;
  // ...
}


Kha - Fr 15.06.12 13:45

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
dies funktioniert nur bei Referenztypen (also nicht bei Wertetypen wie in dem obigen Beispiel int).
Um das zu präzisieren: Ein Double ist kein Int, aber ein geboxter Int ist ein Int. In der Praxis sollte aber sowieso nur der zweite Fall relevant sein, im ersten sind schließlich beide Typen schon statisch bekannt ;) .