While building our Commerce Server 2007 solution it made sense to wrap the LineItem class to easily access the weakly typed indexer accessible properties (which are exposed as object).
Because the underlying datatype could have been anything (ref/value type, nullable, custom) I created a helper method that accepts an object value and returns the value casted to the appropriate type. The can obviously be used in many contexts so I thought I’d share.
public static T ConvertTo(object value)
{
// check for value = null, thx alex
Type t = typeof(T);
// do we have a nullable type?
if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
NullableConverter nc = new NullableConverter(t);
t = nc.UnderlyingType;
}
if (t.IsEnum) // if enum use parse
return (T)Enum.Parse(t, value.ToString(), false);
else
{
// if we have a custom type converter then use it
TypeConverter td = TypeDescriptor.GetConverter(t);
if (td.CanConvertFrom(value.GetType()))
{
return (T)td.ConvertFrom(value);
}
else // otherwise use the changetype
return (T)Convert.ChangeType(value, t);
}
}
DateTime dt = TypeConversionUtility.ConvertTo(dateVal);