private static object ConvertType (MemberInfo pi, Type t, object value)
{
if (value == null)
return null;
Type valueType = value.GetType ();
if (valueType == t)
return value;
try {
if (t.IsEnum) {
string str_value = value as string;
if (str_value != null)
return Enum.Parse (t, str_value, true);
if (Enum.IsDefined (t, value))
return Enum.ToObject (t, value);
}
} catch {
}
TypeConverter converter = Helper.GetConverterFor (pi, t);
if (converter == null) {
try {
converter = new MoonlightTypeConverter (pi == null ? null : pi.Name, t);
} catch {
converter = null;
}
}
if (converter != null && converter.CanConvertFrom (value.GetType ()))
return converter.ConvertFrom (value);
try {
if (!valueType.IsSubclassOf (t))
value = Convert.ChangeType (value, t, System.Globalization.CultureInfo.CurrentCulture);
} catch {
}
// This will just let things fail
return value;
}