c# - Convert.ChangeType()签名类型

时间:2015-02-12 10:31:27

标签: changetype

如果我想得到的数字小于零,如何使用Convert.ChangeType()方法转换无符号整数?

实施例

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

1 个答案:

答案 0 :(得分:0)

我决定问题是创建自己的实现类whith接口IConvertible。

喜欢这个

    /// 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;
        }
    }

呼叫

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