#c# #c #wcf #datacontract #wcf-serialization
Вопрос:
У меня есть программа на C с типичным режимом int
, в котором используется битовая маска. Эта битовая маска определена в перечислении, подобном этому:
enum EModeEntryPoint
{
// Mode
entryPointNone =0x00,
entryPointNormal =0x01,
entryPointExistingAddress =0x02,
entryPointNewAddress =0x04,
entryPointNewAndExisting =0x06,
entryPointOnlyNewTickets =0x08,
};
Когда я использую перечисление в службе C# WCF, как это
[DataContractAttribute]
public enum ModeEntryPoint
{
// Mode
[EnumMember] None =0x00,
[EnumMember] Normal =0x01,
[EnumMember] ExistingAddress =0x02,
[EnumMember] NewAddress =0x04,
[EnumMember] NewAndExisting =0x06,
[EnumMember] OnlyNewTickets =0x08,
};
Я вижу, что значения, которые я здесь определяю, не используются. Я вижу, что такие перечисления всегда «перенумерованы».
Можно ли где-либо определить такое использование битов в контракте?
Создание поля bool для каждого бита-это не то, что мне нравится. Также это раздувает блок данных.
Комментарии:
1. вы хотите использовать
DataContract
илиDataContractAttribute
?2. Я думаю, что вы должны указывать значения перечисления, например
[EnumMember(Value="ExistingAddress")]
3. @MatthewWatson Спасибо. Я посмотрю на это!
4. также: если это биты: подумайте о том, чтобы пометить перечисление
[Flags]
; также может быть полезно рассмотретьNone = 0
,Normal = 1 << 0
,ExistingAddress = 1 << 1
,NewAddress = 1 << 2
,NewAndExisting = NewAddress | ExistingAddress
5. Может быть, вы сможете взглянуть на документы и найти какое-то решение.
Ответ №1:
Ключевое слово [Flags] — это решение.
[DataContractAttribute][Flags]
public enum ModeEntryPoint
{
// Mode
[EnumMember] None = 0x00,
[EnumMember] Normal = 0x01,
[EnumMember] ExistingAddress = 0x02,
[EnumMember] NewAddress = 0x04,
[EnumMember]
NewAndExisting = ExistingAddress| NewAddress,
[EnumMember] OnlyNewTickets = 0x08,
};
Это позволяет клиенту WCF удалять определенные поля этого типа.