Example #1
0
        public static Instruction Create(Type type, bool liftedToNull)
        {
            if (liftedToNull)
            {
                // Boxed enums can be unboxed as their underlying types:
                switch (System.Dynamic.Utils.TypeExtensions.GetTypeCode(type.GetTypeInfo().IsEnum ? Enum.GetUnderlyingType(type) : TypeUtils.GetNonNullableType(type)))
                {
                    case TypeCode.Boolean: return s_booleanLiftedToNull ?? (s_booleanLiftedToNull = new NotEqualBooleanLiftedToNull());
                    case TypeCode.SByte: return s_SByteLiftedToNull ?? (s_SByteLiftedToNull = new NotEqualSByteLiftedToNull());
                    case TypeCode.Byte: return s_byteLiftedToNull ?? (s_byteLiftedToNull = new NotEqualByteLiftedToNull());
                    case TypeCode.Char: return s_charLiftedToNull ?? (s_charLiftedToNull = new NotEqualCharLiftedToNull());
                    case TypeCode.Int16: return s_int16LiftedToNull ?? (s_int16LiftedToNull = new NotEqualInt16LiftedToNull());
                    case TypeCode.Int32: return s_int32LiftedToNull ?? (s_int32LiftedToNull = new NotEqualInt32LiftedToNull());
                    case TypeCode.Int64: return s_int64LiftedToNull ?? (s_int64LiftedToNull = new NotEqualInt64LiftedToNull());

                    case TypeCode.UInt16: return s_UInt16LiftedToNull ?? (s_UInt16LiftedToNull = new NotEqualUInt16LiftedToNull());
                    case TypeCode.UInt32: return s_UInt32LiftedToNull ?? (s_UInt32LiftedToNull = new NotEqualUInt32LiftedToNull());
                    case TypeCode.UInt64: return s_UInt64LiftedToNull ?? (s_UInt64LiftedToNull = new NotEqualUInt64LiftedToNull());

                    case TypeCode.Single: return s_singleLiftedToNull ?? (s_singleLiftedToNull = new NotEqualSingleLiftedToNull());
                    case TypeCode.Double: return s_doubleLiftedToNull ?? (s_doubleLiftedToNull = new NotEqualDoubleLiftedToNull());

                    case TypeCode.String:
                    case TypeCode.Object:
                        if (!type.GetTypeInfo().IsValueType)
                        {
                            return s_referenceLiftedToNull ?? (s_referenceLiftedToNull = new NotEqualReferenceLiftedToNull());
                        }
                        // TODO: Nullable<T>
                        throw Error.ExpressionNotSupportedForNullableType("NotEqual", type);
                    default:
                        throw Error.ExpressionNotSupportedForType("NotEqual", type);
                }
            }
            else
            {
                // Boxed enums can be unboxed as their underlying types:
                switch (System.Dynamic.Utils.TypeExtensions.GetTypeCode(type.GetTypeInfo().IsEnum ? Enum.GetUnderlyingType(type) : TypeUtils.GetNonNullableType(type)))
                {
                    case TypeCode.Boolean: return s_boolean ?? (s_boolean = new NotEqualBoolean());
                    case TypeCode.SByte: return s_SByte ?? (s_SByte = new NotEqualSByte());
                    case TypeCode.Byte: return s_byte ?? (s_byte = new NotEqualByte());
                    case TypeCode.Char: return s_char ?? (s_char = new NotEqualChar());
                    case TypeCode.Int16: return s_int16 ?? (s_int16 = new NotEqualInt16());
                    case TypeCode.Int32: return s_int32 ?? (s_int32 = new NotEqualInt32());
                    case TypeCode.Int64: return s_int64 ?? (s_int64 = new NotEqualInt64());

                    case TypeCode.UInt16: return s_UInt16 ?? (s_UInt16 = new NotEqualUInt16());
                    case TypeCode.UInt32: return s_UInt32 ?? (s_UInt32 = new NotEqualUInt32());
                    case TypeCode.UInt64: return s_UInt64 ?? (s_UInt64 = new NotEqualUInt64());

                    case TypeCode.Single: return s_single ?? (s_single = new NotEqualSingle());
                    case TypeCode.Double: return s_double ?? (s_double = new NotEqualDouble());

                    case TypeCode.String:
                    case TypeCode.Object:
                        if (!type.GetTypeInfo().IsValueType)
                        {
                            return s_reference ?? (s_reference = new NotEqualReference());
                        }
                        // TODO: Nullable<T>
                        throw Error.ExpressionNotSupportedForNullableType("NotEqual", type);
                    default:
                        throw Error.ExpressionNotSupportedForType("NotEqual", type);
                }
            }
        }
Example #2
0
        public static Instruction Create(Type type, bool liftedToNull)
        {
            if (liftedToNull)
            {
                // Boxed enums can be unboxed as their underlying types:
                Type underlyingType = type.GetTypeInfo().IsEnum ? Enum.GetUnderlyingType(type) : type.GetNonNullableType();

                switch (underlyingType.GetTypeCode())
                {
                case TypeCode.Boolean: return(s_booleanLiftedToNull ?? (s_booleanLiftedToNull = new NotEqualBooleanLiftedToNull()));

                case TypeCode.SByte: return(s_SByteLiftedToNull ?? (s_SByteLiftedToNull = new NotEqualSByteLiftedToNull()));

                case TypeCode.Byte: return(s_byteLiftedToNull ?? (s_byteLiftedToNull = new NotEqualByteLiftedToNull()));

                case TypeCode.Char: return(s_charLiftedToNull ?? (s_charLiftedToNull = new NotEqualCharLiftedToNull()));

                case TypeCode.Int16: return(s_int16LiftedToNull ?? (s_int16LiftedToNull = new NotEqualInt16LiftedToNull()));

                case TypeCode.Int32: return(s_int32LiftedToNull ?? (s_int32LiftedToNull = new NotEqualInt32LiftedToNull()));

                case TypeCode.Int64: return(s_int64LiftedToNull ?? (s_int64LiftedToNull = new NotEqualInt64LiftedToNull()));

                case TypeCode.UInt16: return(s_UInt16LiftedToNull ?? (s_UInt16LiftedToNull = new NotEqualUInt16LiftedToNull()));

                case TypeCode.UInt32: return(s_UInt32LiftedToNull ?? (s_UInt32LiftedToNull = new NotEqualUInt32LiftedToNull()));

                case TypeCode.UInt64: return(s_UInt64LiftedToNull ?? (s_UInt64LiftedToNull = new NotEqualUInt64LiftedToNull()));

                case TypeCode.Single: return(s_singleLiftedToNull ?? (s_singleLiftedToNull = new NotEqualSingleLiftedToNull()));

                case TypeCode.Double: return(s_doubleLiftedToNull ?? (s_doubleLiftedToNull = new NotEqualDoubleLiftedToNull()));

                case TypeCode.String:
                case TypeCode.Object:
                    if (!type.GetTypeInfo().IsValueType)
                    {
                        return(s_referenceLiftedToNull ?? (s_referenceLiftedToNull = new NotEqualReferenceLiftedToNull()));
                    }
                    // TODO: Nullable<T>
                    throw Error.ExpressionNotSupportedForNullableType("NotEqual", type);

                default:
                    throw Error.ExpressionNotSupportedForType("NotEqual", type);
                }
            }
            else
            {
                // Boxed enums can be unboxed as their underlying types:
                Type underlyingType = type.GetTypeInfo().IsEnum ? Enum.GetUnderlyingType(type) : type.GetNonNullableType();

                switch (underlyingType.GetTypeCode())
                {
                case TypeCode.Boolean: return(s_boolean ?? (s_boolean = new NotEqualBoolean()));

                case TypeCode.SByte: return(s_SByte ?? (s_SByte = new NotEqualSByte()));

                case TypeCode.Byte: return(s_byte ?? (s_byte = new NotEqualByte()));

                case TypeCode.Char: return(s_char ?? (s_char = new NotEqualChar()));

                case TypeCode.Int16: return(s_int16 ?? (s_int16 = new NotEqualInt16()));

                case TypeCode.Int32: return(s_int32 ?? (s_int32 = new NotEqualInt32()));

                case TypeCode.Int64: return(s_int64 ?? (s_int64 = new NotEqualInt64()));

                case TypeCode.UInt16: return(s_UInt16 ?? (s_UInt16 = new NotEqualUInt16()));

                case TypeCode.UInt32: return(s_UInt32 ?? (s_UInt32 = new NotEqualUInt32()));

                case TypeCode.UInt64: return(s_UInt64 ?? (s_UInt64 = new NotEqualUInt64()));

                case TypeCode.Single: return(s_single ?? (s_single = new NotEqualSingle()));

                case TypeCode.Double: return(s_double ?? (s_double = new NotEqualDouble()));

                case TypeCode.String:
                case TypeCode.Object:
                    if (!type.GetTypeInfo().IsValueType)
                    {
                        return(s_reference ?? (s_reference = new NotEqualReference()));
                    }
                    // TODO: Nullable<T>
                    throw Error.ExpressionNotSupportedForNullableType("NotEqual", type);

                default:
                    throw Error.ExpressionNotSupportedForType("NotEqual", type);
                }
            }
        }