c# - Convert.ChangeType() signed type

635 Views Asked by At

How to convert unsigned integer using the method Convert.ChangeType() if I want to get the number is less than zero ?

Example

 uint l = 0xFFF0;    
 short ret = (short)Convert.ChangeType(l, typeof(short)); // here error instead of -16 
1

There are 1 best solutions below

0
On BEST ANSWER

I am decided that the problem create own implementation class whith interface IConvertible.

Like this

    /// Class that implements IConvertible
    class ConvertData : IConvertible
    {
        public ConvertData(ulong Value)
        {
            _Field.UlongValue = Value;        
        }

        public ConvertData():this(0)
        {
        }

        public ulong Field
        {
            set { _Field.UlongValue = value; }
            get { return _Field.UlongValue; }
        } 


        ULongStruct _Field;

        [StructLayout(LayoutKind.Explicit)]
        struct ULongStruct
        {
            [FieldOffset(0)]
            public ulong UlongValue;

            [FieldOffset(0)]
            public float FloatValue;

            [FieldOffset(0)]
            public double DoubleValue;

            [FieldOffset(0)]
            public uint UIntValue;

            [FieldOffset(0)]
            public int IntValue;

            [FieldOffset(0)]
            public ushort UShortValue;

            [FieldOffset(0)]
            public short ShortValue;

            [FieldOffset(0)]
            public byte ByteValue;

            [FieldOffset(0)]
            public sbyte SByteValue;
        }

        public TypeCode GetTypeCode()
        {
            return TypeCode.Object;
        }

        bool IConvertible.ToBoolean(IFormatProvider provider)
        {
            return _Field.ByteValue!=0;
        }

        byte IConvertible.ToByte(IFormatProvider provider)
        {
            return _Field.ByteValue;
        }

        char IConvertible.ToChar(IFormatProvider provider)
        {
            return (char)_Field.SByteValue;
        }

        DateTime IConvertible.ToDateTime(IFormatProvider provider)
        {
            return Convert.ToDateTime(_Field.UlongValue);
        }

        decimal IConvertible.ToDecimal(IFormatProvider provider)
        {
            return Convert.ToDecimal(_Field.DoubleValue);
        }

        double IConvertible.ToDouble(IFormatProvider provider)
        {
            return _Field.DoubleValue;
        }

        short IConvertible.ToInt16(IFormatProvider provider)
        {
            return _Field.ShortValue;
        }

        int IConvertible.ToInt32(IFormatProvider provider)
        {
            return _Field.IntValue; 
        }

        long IConvertible.ToInt64(IFormatProvider provider)
        {
            return (long)_Field.UlongValue;
        }

        sbyte IConvertible.ToSByte(IFormatProvider provider)
        {
            return _Field.SByteValue;
        }

        float IConvertible.ToSingle(IFormatProvider provider)
        {
            return _Field.FloatValue;
        }

        string IConvertible.ToString(IFormatProvider provider)
        {
            return String.Format("({0})", _Field.UlongValue);
        }

        object IConvertible.ToType(Type conversionType, IFormatProvider provider)
        {
            return Convert.ChangeType(_Field.UlongValue, conversionType);
        }

        ushort IConvertible.ToUInt16(IFormatProvider provider)
        {
            return _Field.UShortValue; 
        }

        uint IConvertible.ToUInt32(IFormatProvider provider)
        {
            return _Field.UIntValue; 
        }

        ulong IConvertible.ToUInt64(IFormatProvider provider)
        {
            return _Field.UlongValue;
        }
    }

Call

        ConvertData data = new ConvertData(l);
        return (T)Convert.ChangeType(data, typeof(T));