コード例 #1
0
 internal static void EmitDecimal(this ILGenerator il, decimal value)
 {
     if (Decimal.Truncate(value) == value)
     {
         if (Int32.MinValue <= value && value <= Int32.MaxValue)
         {
             int intValue = Decimal.ToInt32(value);
             il.EmitInt(intValue);
             il.EmitNew(typeof(Decimal).GetConstructor(new Type[] { typeof(int) }));
         }
         else if (Int64.MinValue <= value && value <= Int64.MaxValue)
         {
             long longValue = Decimal.ToInt64(value);
             il.EmitLong(longValue);
             il.EmitNew(typeof(Decimal).GetConstructor(new Type[] { typeof(long) }));
         }
         else
         {
             il.EmitDecimalBits(value);
         }
     }
     else
     {
         il.EmitDecimalBits(value);
     }
 }
コード例 #2
0
 private static void EmitDecimalBits(this ILGenerator il, decimal value)
 {
     int[] bits = Decimal.GetBits(value);
     il.EmitInt(bits[0]);
     il.EmitInt(bits[1]);
     il.EmitInt(bits[2]);
     il.EmitBoolean((bits[3] & 0x80000000) != 0);
     il.EmitByte((byte)(bits[3] >> 16));
     il.EmitNew(typeof(decimal).GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(bool), typeof(byte) }));
 }
コード例 #3
0
        internal static void EmitNew(this ILGenerator il, Type type, Type[] paramTypes)
        {
            ConstructorInfo ci = type.GetConstructor(paramTypes);

            il.EmitNew(ci);
        }