Zum Inhalt springen
Fabian Deitelhoff

Konvertieren von generischen Variablen

Aus meinem alten Blog (2012–2017). Der Text steht so, wie ich ihn damals geschrieben habe.

Bei der Vorbereitung eines weiteren Blog-Artikels ist mir bei der Konvertierung einer Zeichenkette zu einer generischen Methoden-Rückgabe aufgefallen, dass ich keine Lust habe, viele if-then-else Konstrukte zu schreiben. Mal davon abgesehen, dass der resultierende Code mehr als unschön ist.

Eine Abhilfe schafft hier die Klasse TypeDescriptor, die in der Base Class Library (BCL) enthalten ist. Über die statische Methode GetConverter kann ein Konverter für den angegebenen Typ abgerufen werden. Das funktioniert, im Gegensatz zu Convert.ChangeType, auch mit dem Datentyp Guid.

Das folgende Gist vergleicht die beiden Versionen. Es sollte also nur die zweite Variante verwendet werden. Dadurch können viele unnötige Abfragen vermieden werden.

Code auf GitHub Gist: GenericConvert.cs →(öffnet in neuem Tab)

Die BCL hält viele Konverter bereit, die direkt verwendet werden können. Abbildung 1 enthält eine Auflistung, die mit ILSpy erstellt wurde.

Bild nicht mehr verfügbarIn der BCL vorhandene TypeConverter.

Abb. 1: In der BCL vorhandene TypeConverter.

Zusätzlich können auch eigene Konverter implementiert werden, die einen string zu einem Typ konvertieren. Dazu muss einfach von der Basisklasse TypeConverter geerbt und die vorhandenen Methoden überschrieben werden. Nähere Informationen dazu gibt es in der MSDN(öffnet in neuem Tab). Wird der zu konvertierende Typ abschließend mit [TypeConverter(typeof(MyNewTypeConverter))] annotiert, kann der Typ anschließend konvertiert werden.

Das ist auf jeden Fall eine wesentlich bessere Alternative, als die naive Implementierung mit if-then-else.