Jul.07
Conversie van (nullable) valuetypes
Je kent het wel, je wilt de conversie van het ene naar het andere valuetype doen. Bijvoorbeeld een string omzetten naar een int. Gebruikelijk is om dat te doen met de volgende code:
1 |
Convert.ToInt32("881974"); |
Een andere optie is:
1 |
Convert.ChangeType("881974", typeof(Int32)); //conversie van string naar int |
Deze laatste methode kan handig zijn als gebruik wordt gemaakt van reflection. Je weet dan vaak niet vooraf om welke bron en/of doeltypes het gaat.
1 2 3 4 |
//Verondersteld er is een object met een property met de naam "MyProperty" //Bepaal het type van MyProperty System.Type MyPropertyType = this.GetType().GetProperty("MyProperty").PropertyType; Convert.ChangeTo("881974", MyPropertyType); |
Het type van MyProperty is onbekend maar zolang de string “881974” geconverteerd kan worden naar het type MyPropertyType is er geen probleem. Als MyPropertyType een string, decimal, int, float etc… is gaat het goed. Is het een bool dan gaat het uiteraard mis.
Allemaal heel mooi natuurlijk, maar deze Convert functies bieden geen ondersteuning voor nullable types. Willen we een bijvoorbeeld een string omzetten naar een int? (nullable int) dan hebben we een probleem. Tot nu toe, want hier is een oplossing ;-).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public abstract class DoConvert { ... public static object ChangeType( object value, Type conversionType ) { if( conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals( typeof( Nullable<> ) ) ) { if( value == null ) return null; System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter( conversionType ); conversionType = nullableConverter.UnderlyingType; } return Convert.ChangeType( value, conversionType ); } |
Bovenstaande functie ondersteund de conversie van nullable types. Wil je een echt elegante oplossing dan kunnen we met behulp van Generics de volgende methode maken binnen dezelfde DoConvert klasse, namelijk:
1 2 3 4 5 6 7 8 |
public static T To<T>( object Value ) { System.Type conversionType = typeof( T ); return (T) ChangeType( Value, conversionType ); } |
Je gebruikt deze functie als volgt:
1 2 3 |
int ConvertedValue = DoConvert.To<Int32>("881974"); //Conversie van string naar Int32 |
Voila!