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.
[gist id=70211975936e954d0b4e file=GenericConvert.cs]
Die BCL hält viele Konverter bereit, die direkt verwendet werden können. Abbildung 1 enthält eine Auflistung, die mit ILSpy erstellt wurde.
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. 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
.
[…] Das Verfahren beziehungsweise die Implementierung dazu habe ich schon in einem vorherigen Blog-Artikel […]