/// <summary> /// Creates or throws a converter. /// </summary> internal static IValueConverter <TValue> CreateOrThrow <TValue>() { var created = StringConverter <TValue> .TryCreate(out var converter) || ParseConverter <TValue> .TryCreate(out converter) || EnumConverter <TValue> .TryCreate(out converter) || NullableTypeParseConverter <TValue> .TryCreate(out converter) || NullableEnumConverter <TValue> .TryCreate(out converter) || ConstructorConverter <TValue> .TryCreate(out converter) || CastConverter <TValue> .TryCreate(out converter); if (created) { return(converter !); } throw ConfigurationExceptions.NoDefaultConverter <TValue>(); }
/// <summary> /// Tries to create an instance. /// </summary> internal static bool TryCreate(out IValueConverter <TValue>?converter) { converter = null; var nullableType = typeof(TValue); if (!nullableType.IsNullableType()) { return(false); } var underlyingType = nullableType.GetGenericArguments()[0]; if (!underlyingType.IsEnum) { return(false); } var strParamExpr = Expression.Parameter(typeof(string), "str"); var constTypeExpr = Expression.Constant(underlyingType); var trueExpr = Expression.Constant(true); var callParseExpr = Expression.Call(TypeHelpers.GetEnumParseMethodInfo(), constTypeExpr, strParamExpr, trueExpr); var convertExpr = Expression.Convert(callParseExpr, nullableType); var defaultExpr = Expression.Default(nullableType); var callIsNullOrWsExpr = Expression.Call(TypeHelpers.StringIsNullOrWhiteSpaceMethodInfo, strParamExpr); var conditionExpr = Expression.Condition(callIsNullOrWsExpr, defaultExpr, convertExpr); var lambdaExpr = Expression.Lambda <Func <string, TValue> >(conditionExpr, strParamExpr); var function = lambdaExpr.Compile(); converter = new NullableEnumConverter <TValue>(value => { try { return(function(value)); } catch (ArgumentException) { throw Exceptions.EnumConversionFailed(underlyingType, value); } }); return(true); }