public static object ConvertObject (DependencyProperty dp, object val, Type objectType, bool doToStringConversion)
{
// Should i return default(T) if property.PropertyType is a valuetype?
if (val == null)
return val;
if (dp.PropertyType.IsAssignableFrom (val.GetType ()))
return val;
if (dp.PropertyType == typeof (string))
return doToStringConversion ? val.ToString() : "";
TypeConverter tc = null;
if (dp.IsAttached) {
tc = Helper.GetConverterFor (GetGetterMethodForAttachedDP (dp, val), dp.PropertyType);
}
else {
PropertyInfo pi = dp.DeclaringType.GetProperty (dp.Name);
if (pi != null) {
tc = Helper.GetConverterFor (pi, pi.PropertyType);
if (tc == null)
tc = new MoonlightTypeConverter (pi.Name, pi.PropertyType);
}
}
if (tc == null)
tc = new MoonlightTypeConverter (dp.Name, dp.PropertyType);
if (!tc.CanConvertFrom (val.GetType()))
throw new Exception (string.Format ("type converter {0} can't convert from type {1} to type {2}", tc.GetType(), val.GetType(), dp.PropertyType));
return tc.ConvertFrom (val);
}