Проблема с приведением
От: Аноним  
Дата: 12.11.05 08:42
Оценка:
// BaseMemberMapper.MapFrom(Type type, Attribute[] attributes, object value, bool trimmable)
// ...
// 
Type underlyingType = Enum.GetUnderlyingType(type);

if (underlyingType != value.GetType())
    value = Convert.ChangeType(value, underlyingType);

value = Enum.Parse(type, Enum.GetName(type, value));


Не работает для Flags перечислений. Выделенная строчка возвращает Null. Из базы приходит int. Решил проблему через IMapSettable, на как-то это все не очень здорово. Идеи есть?
Re: Проблема с приведением
От: Alexey Axyonov Украина  
Дата: 12.11.05 09:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>
А>// BaseMemberMapper.MapFrom(Type type, Attribute[] attributes, object value, bool trimmable)
А>// ...
А>// 
А>Type underlyingType = Enum.GetUnderlyingType(type);

А>if (underlyingType != value.GetType())
А>    value = Convert.ChangeType(value, underlyingType);

А>value = Enum.Parse(type, Enum.GetName(type, value));
А>


А>Не работает для Flags перечислений. Выделенная строчка возвращает Null. Из базы приходит int. Решил проблему через IMapSettable, на как-то это все не очень здорово. Идеи есть?


Вот так должно работать:

// BaseMemberMapper.MapFrom(Type type, Attribute[] attributes, object value, bool trimmable)
// ...
// 
Type underlyingType = Enum.GetUnderlyingType(type);

if (underlyingType != value.GetType())
    value = Convert.ChangeType(value, underlyingType);

value = Enum.ToObject(type, value);
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[2]: Проблема с приведением
От: Alexey Axyonov Украина  
Дата: 12.11.05 09:12
Оценка:
AA>Вот так должно работать:

AA>
AA>// BaseMemberMapper.MapFrom(Type type, Attribute[] attributes, object value, bool trimmable)
AA>// ...
AA>// 
AA>Type underlyingType = Enum.GetUnderlyingType(type);

AA>if (underlyingType != value.GetType())
AA>    value = Convert.ChangeType(value, underlyingType);

AA>value = Enum.ToObject(type, value);
AA>


В потверждение этому вот код который проверен на FW 1.1/2.0:

    class Program
    {
        [Flags]
        enum Flags : byte
        {
            Flag1 = 1,
            Flag2 = 2,
            Flag4 = 4,
            Flag16 = 16
        }

        static void Main(string[] args)
        {
            object value = 17L;

            if (value.GetType() != Enum.GetUnderlyingType(typeof(Flags)))
                value = Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(Flags)));

            Flags f = (Flags)Enum.ToObject(typeof(Flags), value);
            Console.WriteLine(f);
        }
    }
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[3]: Проблема с приведением
От: Аноним  
Дата: 12.11.05 09:23
Оценка:
Здравствуйте, Alexey Axyonov, Вы писали:

AA>>Вот так должно работать:


AA>>
AA>>// BaseMemberMapper.MapFrom(Type type, Attribute[] attributes, object value, bool trimmable)
AA>>// ...
AA>>// 
AA>>Type underlyingType = Enum.GetUnderlyingType(type);

AA>>if (underlyingType != value.GetType())
AA>>    value = Convert.ChangeType(value, underlyingType);

AA>>value = Enum.ToObject(type, value);
AA>>


AA>В потверждение этому вот код который проверен на FW 1.1/2.0:


AA>
AA>    class Program
AA>    {
AA>        [Flags]
AA>        enum Flags : byte
AA>        {
AA>            Flag1 = 1,
AA>            Flag2 = 2,
AA>            Flag4 = 4,
AA>            Flag16 = 16
AA>        }

AA>        static void Main(string[] args)
AA>        {
AA>            object value = 17L;

AA>            if (value.GetType() != Enum.GetUnderlyingType(typeof(Flags)))
AA>                value = Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(Flags)));

AA>            Flags f = (Flags)Enum.ToObject(typeof(Flags), value);
AA>            Console.WriteLine(f);
AA>        }
AA>    }
AA>


Спасибо за решение.

Интересно что, строчка
Enum.ToObject(type, value);

закомментарена в RFD
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.