avatar
Today is Friday
October 18, 2019

Search Results Archives: July 2007

July 7, 2007

Conversie van (nullable) valuetypes

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

Convert.pngJe 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:

Convert.ToInt32("881974");

Een andere optie is:

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.

//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 ;-) .

<code>
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 );
}
</code>

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:

<code>
public static T To<T>( object Value )
{
  System.Type conversionType = typeof( T );

  return (T) ChangeType( Value, conversionType );
}
</code>

Je gebruikt deze functie als volgt:

<code>
int ConvertedValue = DoConvert.To<Int32>("881974"); //Conversie van string naar Int32
</code>

Voila!

© 2019 Snoei's .NET blog All rights reserved - Wallow theme v0.44 by ([][]) TwoBeers - Powered by WordPress - Have fun!