private object MatchConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType, ConvertToDel baseConvertTo) => (value as IOptional)?.MatchUntyped( Some: x => IsSomeConvertTo(x, context, culture, value, destinationType, baseConvertTo), None: () => ConvertToValueNull(context, culture, destinationType, baseConvertTo));
private object SimpleConvertTo(object x, ITypeDescriptorContext context, CultureInfo culture, Type destinationType, ConvertToDel baseConvertTo) => simpleTypeConverter == null ? baseConvertTo(context, culture, x, destinationType) : simpleTypeConverter.ConvertTo(context, culture, x, destinationType);
private object IsSomeConvertTo(object x, ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType, ConvertToDel baseConvertTo) => destinationType == simpleType ? x : destinationType == typeof(InstanceDescriptor) ? NewInstanceDesc(value) : isnull(x) ? ConvertToValueNull(context, culture, destinationType, baseConvertTo) : SimpleConvertTo(x,context,culture,destinationType,baseConvertTo);
public object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType, ConvertToDel baseConvertTo) => isnull(value) ? ConvertToValueNull(context, culture, destinationType, baseConvertTo) : MatchConvertTo(context, culture, value, destinationType, baseConvertTo);
private object ConvertToValueNull(ITypeDescriptorContext context, CultureInfo culture, Type destinationType, ConvertToDel baseConvertTo ) => destinationType == typeof(string) ? String.Empty : baseConvertTo(context, culture, null, destinationType);
private object IsSomeConvertTo(object x, ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType, ConvertToDel baseConvertTo) => destinationType == simpleType ? x : destinationType == typeof(InstanceDescriptor) ? NewInstanceDesc(value) : isnull(x) ? ConvertToValueNull(context, culture, destinationType, baseConvertTo) : SimpleConvertTo(x, context, culture, destinationType, baseConvertTo);
private object ConvertToValueNull(ITypeDescriptorContext context, CultureInfo culture, Type destinationType, ConvertToDel baseConvertTo) => destinationType == typeof(string) ? String.Empty : baseConvertTo(context, culture, null, destinationType);