比如如下定义
syntax = "proto3"; option csharp_namespace = "Demo"; option java_package = "Demo"; package Demo; enum Scenario { scenario_unknow=0; type1=1; scenario2=2; } enum Color { COLOR_RED = 0; COLOR_GREEN = 1; COLOR_BLUE = 2; }
生成的 C#代码
#region Enums public enum Scenario { [pbr::OriginalName("scenario_unknow")] Unknow = 0, [pbr::OriginalName("type1")] Type1 = 1, [pbr::OriginalName("scenario2")] _2 = 2, } public enum Color { [pbr::OriginalName("COLOR_RED")] Red = 0, [pbr::OriginalName("COLOR_GREEN")] Green = 1, [pbr::OriginalName("COLOR_BLUE")] Blue = 2, } #endregion
java 代码
public enum Scenario implements com.google.protobuf.ProtocolMessageEnum { /** * <code>scenario_unknow = 0;</code> */ scenario_unknow(0), /** * <code>type1 = 1;</code> */ type1(1), /** * <code>scenario2 = 2;</code> */ scenario2(2), UNRECOGNIZED(-1), ; } public enum Color implements com.google.protobuf.ProtocolMessageEnum { /** * <code>COLOR_RED = 0;</code> */ COLOR_RED(0), /** * <code>COLOR_GREEN = 1;</code> */ COLOR_GREEN(1), /** * <code>COLOR_BLUE = 2;</code> */ COLOR_BLUE(2), UNRECOGNIZED(-1), ; }
可以看到生成后的枚举成员中自动将枚举名称替换成空白了.这导致 Scenario.scenario2
生成的代码中成员名为 _2
也许这多半是by design
的,但是,是否有选项可以控制这种行为?
谢谢
![]() | 1 a33291 OP 另外我看了官方仓库 grpc 中的 csharp 部分,没看到其中的这种处理逻辑在哪里完成的 这个 Grpc.Tools 工具貌似只是为了构建一个 msbuild task 拼接 protoc 命令执行生成代码 这和我直接执行 protoc 生成的代码是一样的,所以逻辑应该不在 Grpc.Tools 中 ![]() |
2 Philippa 2024-08-27 09:02:26 +08:00 via iPhone ![]() 这是规范,你的 enum 就不符合规范。看 google 的 grpc 文档,或使用工具比如 buf lint 一下所有的错误。 |
![]() | 3 lqs 2024-08-27 09:20:13 +08:00 ![]() 按照规范(为了兼容 C 之类的语言),不能在两个 enum 里定义同样的成员名称,所以通常都给成员加上前缀 然后有些语言的代码生成器会自动去掉这个前缀,所以就造成了这样的行为 |
![]() | 4 a33291 OP |