Beispiel #1
0
        /// <summary>
        /// 返回指定类型的对象,其值等效于指定对象。参数提供区域性特定的格式设置信息。
        /// 只对允许进行隐式类型转换。
        /// </summary>
        /// <param name="value">要转换的对象。</param>
        /// <param name="conversionType">要返回的对象的类型。</param>
        /// <param name="provider">一个提供区域性特定的格式设置信息的对象。</param>
        /// <returns>一个对象,其类型为 <paramref name="conversionType"/>,
        /// 并且其值等效于 <paramref name="value"/>。</returns>
        internal static object ImplicitChangeType(object value, Type conversionType, IFormatProvider provider)
        {
            Type nonNullableType;

            if (BasicChangeType(ref value, conversionType, out nonNullableType))
            {
                return(value);
            }
            Type type = value.GetType();
            // 尝试标准隐式类型转换。
            bool   success;
            object result = StandardImplicitChangeType(value, type, nonNullableType, provider, out success);

            if (success)
            {
                return(result);
            }
            // 对隐式类型转换运算符进行判断。
            ConversionMethod method = ConversionCache.GetImplicitConversion(type, conversionType);

            if (method != null)
            {
                value = MethodInfo.GetMethodFromHandle(method.Method).Invoke(null, new object[] { value });
                if (value != null)
                {
                    type = value.GetType();
                    if (type != nonNullableType)
                    {
                        // 处理用户定义隐式类型转换之后的标准隐式类型转换。
                        value = StandardImplicitChangeType(value, type, nonNullableType, provider, out success);
                    }
                }
                return(value);
            }
            throw ExceptionHelper.ConvertInvalidValue(value, conversionType);
        }