Как получить перечисление флагов для преобразования в UInt64 с TypeConverter - PullRequest
3 голосов
/ 10 мая 2011

У меня есть класс, который принимает общий конструктор TState в своем конструкторе, при условии, что TState может быть преобразовано в UInt64 с помощью TypeConverter. Затем он будет использоваться в качестве флагов.

Я хочу использовать [Flags] enum для TState, но даже если я определю его как

[Flags]  
public enum EState : ulong
{
    None = 0x0,
    State1= 0x1,
    State2= 0x2,
    State3= 0x4
}

, тогда если TypeConverter typeConv = TypeDescriptor.GetConverter(typeof(EState)); typeConv.CanConvertTo(typeof(UInt64)) ложно.

Как я могу сделать перечисление, которое будет преобразовываться соответствующим образом? Спасибо!

1 Ответ

2 голосов
/ 10 мая 2011

Вы можете использовать Convert.ChangeType():

[Flags]
private enum MyEnum1 : ulong 
{
   A =1,
   B = 2
}

А затем

MyEnum1 enum1 = MyEnum1.A | MyEnum1.B;
ulong changeType = (ulong) Convert.ChangeType(enum1, typeof (ulong));

ОБНОВЛЕНИЕ

Почему TypeDescriptor не работает?

Согласно документам:

Этот метод ищет соответствующий преобразователь типов, ища атрибут TypeConverterAttribute.Если он не может найти TypeConverterAttribute, он обходит иерархию базового класса класса, пока не найдет примитивный тип.

TypeDescriptor и TypeConvertor работают с ExpandableObjectConverter, тогда как Convert работает с IConvertible.

...