Exemple #1
0
        /// <summary>
        /// 对指定类型执行基本的类型转换判断,包括转换为 object 和 null 转换。
        /// 基本类型转换失败时,保证 value != null,nonNullableType != null。
        /// </summary>
        /// <param name="value">要转换的对象。</param>
        /// <param name="conversionType">要返回的对象的类型。</param>
        /// <param name="nonNullableType"><paramref name="value"/> 对应的 non-nullable-type。</param>
        /// <returns>如果基本类型转换成功,则为 <c>true</c>;否则为 <c>false</c>。</returns>
        private static bool BasicChangeType(ref object value, Type conversionType, out Type nonNullableType)
        {
            ExceptionHelper.CheckArgumentNull(conversionType, "conversionType");
            if (conversionType.IsByRef)
            {
                conversionType = conversionType.GetElementType();
            }
            // 总是可以转换为 Object。
            if (conversionType == typeof(object))
            {
                nonNullableType = null;
                return(true);
            }
            // value 为 null 的情况。
            bool nullableCType = TypeExt.IsNullableType(conversionType, out nonNullableType);

            if (value == null)
            {
                if (conversionType.IsValueType && !nullableCType)
                {
                    throw ExceptionHelper.CannotCastNullToValueType();
                }
                return(true);
            }
            return(false);
        }