Exemplo n.º 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 CommonExceptions.ConvertInvalidValue(value, conversionType);
		}