Beispiel #1
0
 /// <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;
 }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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;
 }