BinaryWriter и типы
От: Аноним  
Дата: 30.10.06 08:42
Оценка:
Можно ли сдесь обойтись без switch?

        static void Write(string typeName, Object value, BinaryWriter bw)
        {
            switch (typeName)
            {
                case "Byte":
                    bw.Write((Byte)value);
                    break;
                case "UInt16":
                    bw.Write((UInt16)value);
                    break;
                case "UInt32":
                    bw.Write((UInt32)value);
                    break;
                case "Char":
                    bw.Write((Char)value);
                    break;
                default:
                    Console.WriteLine("Type = {0}, Value = {1}", typeName, value);
                    break;
            }
        }
Re: BinaryWriter и типы
От: Spender Канада http://rybkov.livejournal.com
Дата: 30.10.06 09:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно ли сдесь обойтись без switch?


А>
А>        static void Write(string typeName, Object value, BinaryWriter bw)
А>        {
А>            switch (typeName)
А>            {
А>                case "Byte":
А>                    bw.Write((Byte)value);
А>                    break;
А>                case "UInt16":
А>                    bw.Write((UInt16)value);
А>                    break;
А>                case "UInt32":
А>                    bw.Write((UInt32)value);
А>                    break;
А>                case "Char":
А>                    bw.Write((Char)value);
А>                    break;
А>                default:
А>                    Console.WriteLine("Type = {0}, Value = {1}", typeName, value);
А>                    break;
А>            }
А>        }
А>



if( typeName == "Byte" || typeName == "UInt16" || typeName = "UInt32" || typeName == "Char" )
{
    bw.Write((Char)value);
}
else
{
    Console.WriteLine("Type = {0}, Value = {1}", typeName, value);
}


Мне кажеся эквивалент 100%
Re[2]: BinaryWriter и типы
От: Spender Канада http://rybkov.livejournal.com
Дата: 30.10.06 09:09
Оценка:
Не нашел как редактировать:

bw.Write(value);
Re: BinaryWriter и типы
От: Alexey_N  
Дата: 30.10.06 09:15
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Можно ли сдесь обойтись без switch?


А>
А>        static void Write(string typeName, Object value, BinaryWriter bw)
А>        {
А>            switch (typeName)
А>            {
А>                ...
А>            }
А>        }
А>

Можно. Нужно написать оверлоад с нужным типом для каждого case.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://rsdn.org/File/58228/Shaman.GIF
Re: BinaryWriter и типы
От: desco США http://v2matveev.blogspot.com
Дата: 30.10.06 09:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно ли сдесь обойтись без switch?


А>
А>        static void Write(string typeName, Object value, BinaryWriter bw)
А>        {
А>            switch (typeName)
А>            {
А>                case "Byte":
А>                    bw.Write((Byte)value);
А>                    break;
А>                case "UInt16":
А>                    bw.Write((UInt16)value);
А>                    break;
А>                case "UInt32":
А>                    bw.Write((UInt32)value);
А>                    break;
А>                case "Char":
А>                    bw.Write((Char)value);
А>                    break;
А>                default:
А>                    Console.WriteLine("Type = {0}, Value = {1}", typeName, value);
А>                    break;
А>            }
А>        }
А>


1. typeName передавать совсем необязательно, его можно получить на месте:

string typename = value.GetType().Name


2. switch можно заменить на Dictionary вида тип -> делегат для записи значения этого типа.
что-то вроде такого:


       public delegate void WriteAction(object obj, BinaryWriter writer);
        static Dictionary<TypeCode, WriteAction> writerActions = GetWriteActions();
        static private Dictionary<TypeCode, WriteAction> GetWriteActions()
        {
            Dictionary<TypeCode, WriteAction> writers = new Dictionary<TypeCode, WriteAction>();

            writers.Add(TypeCode.Int32, delegate(object o, BinaryWriter writer)
                                            {
                                                writer.Write((int)o);
                                            });
            writers.Add(TypeCode.Boolean, delegate(object o, BinaryWriter writer)
                                            {
                                                writer.Write((bool)o);
                                            });
            //...
            
            return writers;
        }

        static void Write(object value, BinaryWriter writer)
        {
            WriteAction writeAction;
            Type type = value.GetType();
            if (writerActions.TryGetValue(Type.GetTypeCode(type), out writeAction))
            {
                writeAction(value, writer);
            }
            else
            {
                Console.WriteLine("Type = {0}, Value = {1}", type.Name, value);
                //...
            }
        }
http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif
Re: BinaryWriter и типы
От: Аноним  
Дата: 30.10.06 10:41
Оценка:
Здесь имелось в виду: можно ли программно преобразовывать тип, что то вроде:
bw.Write((typeName)value);


Вместо string typeName можно передавать Type typeInfo, но вопрос тотже.
Re[2]: BinaryWriter и типы
От: Аноним  
Дата: 30.10.06 10:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здесь имелось в виду: можно ли программно преобразовывать тип, что то вроде:

А>
А>bw.Write((typeName)value);
А>


А>Вместо string typeName можно передавать Type typeInfo, но вопрос тотже.


Используя рефлексию, например.
MethodInfo m = bw.GetType().GetMethod("Write", new Type[] { typeOfValue });
m.Invoke(...);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.