コード例 #1
0
        /// <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>();
        }
コード例 #2
0
        /// <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);
        }