/// <summary> /// 使用指定的转换类型和要复制 IL 指令的数值类型转换初始化 <see cref="NumericConversion"/> 类的新实例。 /// </summary> /// <param name="conversionType">当前转换的类型。</param> /// <param name="conversion">要复制的数值类型转换。</param> public NumericConversion(ConversionType conversionType, NumericConversion conversion) : base(conversionType) { Contract.Requires(conversion != null); uncheckedOpCodes = conversion.uncheckedOpCodes; checkedOpCodes = conversion.checkedOpCodes; }
/// <summary> /// 返回将对象从数值类型 <paramref name="inputType"/> 转换为数值类型 <paramref name="outputType"/> /// 的类型转换。 /// </summary> /// <param name="inputType">要转换的对象的类型。</param> /// <param name="inputTypeCode">要转换的对象的类型。</param> /// <param name="outputType">要将输入对象转换到的类型。</param> /// <param name="outputTypeCode">要将输入对象转换到的类型。</param> /// <returns>将对象从 <paramref name="inputType"/> 类型转换为 <paramref name="outputType"/> /// 类型的类型转换,如果不存在则为 <c>null</c>。</returns> private static Conversion GetNumericOrEnumConversion(Type inputType, TypeCode inputTypeCode, Type outputType, TypeCode outputTypeCode) { Contract.Requires(inputType != null && outputType != null); Contract.Requires(Type.GetTypeCode(inputType) == inputTypeCode && Type.GetTypeCode(outputType) == outputTypeCode); Contract.Requires(inputTypeCode.IsNumeric() && outputTypeCode.IsNumeric()); // 处理输入 decimal 类型。 if (inputTypeCode == TypeCode.Decimal) { return(outputType.IsEnum ? DecimalConversion.ExplicitEnum : DecimalConversion.ExplicitNumeric); } // 处理输出 decimal 类型。 if (outputTypeCode == TypeCode.Decimal) { if (inputType.IsEnum) { return(DecimalConversion.ExplicitEnum); } if (inputType == typeof(float) || inputType == typeof(double)) { return(DecimalConversion.ExplicitNumeric); } return(DecimalConversion.ImplicitNumeric); } Conversion conversion = GetNumericConversion(inputTypeCode, outputTypeCode); if (inputType.IsEnum || outputType.IsEnum) { // 将类型转换的类型修正为 Enum。 NumericConversion numericConv = conversion as NumericConversion; return(numericConv == null ? IdentityConversion.ExplicitEnum : new NumericConversion(ConversionType.Enum, numericConv)); } return(conversion); }
/// <summary> /// 使用指定的转换类型和要复制 IL 指令的数值类型转换初始化 <see cref="NumericConversion"/> 类的新实例。 /// </summary> /// <param name="conversionType">当前转换的类型。</param> /// <param name="conversion">要复制的数值类型转换。</param> public NumericConversion(ConversionType conversionType, NumericConversion conversion) : base(conversionType) { Contract.Requires(conversion != null); this.uncheckedOpCodes = conversion.uncheckedOpCodes; this.checkedOpCodes = conversion.checkedOpCodes; }