// 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.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>>
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>>
Здравствуйте, 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