Re: Getting a byte array from a generic class

Steve Johnson <[email protected]> Tue, 18 May 2010 12:30:53 -0400
Newsgroups gmane.comp.windows.devel.dotnet.advanced
Message-ID <[email protected]>
Actually, you'd have to use decimal instead of double in order for #2 to
work.  You didn't include decimal in your original message, but I now
understand that those types were merely examples.

--
Steve Johnson

On Tue, May 18, 2010 at 12:23 PM, Steve Johnson <[email protected]> wrote:

> Some other ideas, but they have issues:
>
> 1 - You could use binary serialization, but that would have a bunch of
> overhead.
>
> 2 - Since you will only be supporting numeric primitives, you could do the
> following, but it would be slow and require boxing.
>
> public byte[] AsByteArray()
> {
>     double d = (double)Convert.ChangeType(_value, typeof(double));
>     return BitConverter.GetBytes(d);
> }
>
> public void FromByteArray(byte[] bytes)
> {
>     double d = BitConverter.ToDouble(bytes, 0);
>     _value = (T)Convert.ChangeType(d, typeof(T));
> }
>
> This would also require 8 bytes for any value, which would be bad if
> bandwidth is an issue.
>
> --
> Steve Johnson
>
>
> On Tue, May 18, 2010 at 10:54 AM, Eddie Lascu <[email protected]> wrote:
>
>> Hi there,
>>
>> I need to pick your brains with regard to a more elegant solution to a
>> problem I'm dealing with right now. I have a generic class that wraps any
>> type of numeric values (short, int, decimal, double or float). Removing the
>> parts that are not interesting, this class is something like this:
>>
>>    public abstract class NumericNtcipObject<T> where T : struct,
>> IComparable<T>
>>    {
>>        protected NumericNtcipObject(T value)
>>        {
>>            double val;
>>            Debugging.Assert(typeof(T).IsValueType &&
>> typeof(T).IsPrimitive);
>>            Debugging.Assert(double.TryParse(value.ToString(), out val));
>>
>> Value = value;
>>        }
>>
>>        public T Value
>>        {
>>            set
>>            {
>>                _value = value;
>>            }
>>        }
>>
>>        public byte[] ValueAsByteStream
>>        {
>>            get
>>            {
>>                  // Need help here
>>            }
>>        }
>>
>>        protected T _value;
>>    }
>>
>> The class will be derived from and will only be instantiated with numeric
>> values. I want to create a property that can give me a byte array containing
>> all the bytes of the underlying value. If this would not be a generic class,
>> I could do:
>>
>> return BitConverter.GetBytes(Value);
>>
>> Unfortunately, BitConverter.GetBytes cannot resolve the type of Value so
>> this solution goes out the window. I need the exact number of bytes, so
>> casting to a type with a larger range is not good.
>>
>> I can do something like this:
>>
>>
>>        public byte[] ValueAsByteStream
>>        {
>>            get
>>            {
>>                if(typeof(T) == typeof(Int16))
>>                {
>>                    return BitConverter.GetBytes(Value.ToInt16(new
>> NumberFormatInfo()));
>>                }
>>
>>                if (typeof(T) == typeof(Int32))
>>                {
>>                    return BitConverter.GetBytes(Value.ToInt32(new
>> NumberFormatInfo()));
>>                }
>>
>>                if (typeof(T) == typeof(Int64))
>>                {
>>                    return BitConverter.GetBytes(Value.ToInt64(new
>> NumberFormatInfo()));
>>                }
>>
>>                if (typeof(T) == typeof(UInt16))
>>                {
>>                    return BitConverter.GetBytes(Value.ToUInt16(new
>> NumberFormatInfo()));
>>                }
>>
>>                if (typeof(T) == typeof(UInt32))
>>                {
>>                    return BitConverter.GetBytes(Value.ToUInt32(new
>> NumberFormatInfo()));
>>                }
>>
>>                if (typeof(T) == typeof(UInt64))
>>                {
>>                    return BitConverter.GetBytes(Value.ToUInt64(new
>> NumberFormatInfo()));
>>                }
>>                // rest of types here
>>
>>                return null;
>>            }
>>        }
>>
>> but this is not very nice.
>>
>> Can either of you smart guys give me a brilliant idea here?
>>
>> Thanks in advance,
>> Eddie
>>
>> ===================================
>> View archives and manage your subscription(s) at
>> http://peach.ease.lsoft.com/archives
>>
>
>

===================================
View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives