我使用protobuf-net和ProtoGen.exe
来解析以下.proto文件(由另一个项目提供)
enum RGBFlags { FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4; }
message SomeMessage {
// Values from RGBFlags only allowed
optional int32 flags = 2;
}
我在C ++中的程序员不关心类型安全性,并将flags
字段视为普通整数。我想要更严格,并试图避免这样的代码:
SomeMessage foo = new SomeMessage();
foo.flags = (int)RGBFlags.FLAG_BLUE | (int)RGBFlags.FLAG_GREEN;
我认为我可以使用protbuf custom options修改原型代码并修改ProtoGet
的{{3}}以生成必要的“[Flags]”注释。
extend google.protobuf.EnumOptions {
optional bool generate_bit_field = 60000;
}
enum RGBFlags {
option (generate_bit_field) = true;
FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4;
}
message SomeMessage {
// Values from RGBFlags only allowed
optional int32 flags = 2;
}
问题是所有自定义选项在uninterpreted_option
的临时文件中显示为ProtoGen
。
我知道如何在我的代码中获取[Flags]
注释?
答案 0 :(得分:1)
重新标志;原始protobuf规范并不真正支持复合枚举值,因此在某些方面我理解为什么他们这样做。遗憾的是,没有partial enum
这样的内容,因此您无法将[Flags]
添加到单独的代码文件中。
重新定制选项;这是一个很好的问题,之前已经提出了对自定义选项的支持。这绝对是我想添加的东西,但 相对于其他功能 它根本不是一个大规模需求的项目,所以(由于资源有限)它没有(尚未完全)进行了调查。
因此,我没有一个很好的答案;这个功能现在还不是很多。您可以在xslt(针对您的特定类型)中对该场景进行硬编码。或者等到我解决它(我没有特定的时间表)。或亲自看看。