Я хотел бы создать пользовательские параметры для значений Enum
в файле прото версии 3. Например, что-то вроде этого:
extend google.protobuf.EnumValueOptions {
int32 enum_value_opt1 = 1560678;
}
https://github.com/protocolbuffers/protobuf/blob/master/csharp/protos/unittest_custom_options_proto3.proto#L80
Я пытаюсь получить 1560678
в C # из скомпилированного класса. Например, если я посмотрю на enum TestMessageWithCustomOptions.AnEnum
в модульном тесте исходного кода protobuf:
enum AnEnum {
option (enum_opt1) = -789;
ANENUM_UNSPECIFIED = 0;
ANENUM_VAL1 = 1;
ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
}
https://github.com/protocolbuffers/protobuf/blob/master/csharp/protos/unittest_custom_options_proto3.proto#L112
Я могу получить значение enum_value_opt1
примерно так:
//Need the enum descriptor
var enumDescriptor = TestMessageWithCustomOptions
.Descriptor
.EnumTypes
.First(d => d.ClrType == typeof(TestMessageWithCustomOptions.Types.AnEnum));
foreach (var edv in enumDescriptor.Values)
{
//Get the eval value and print Enum val, proto original name, custom option value
if (edv.CustomOptions.TryGetInt32(1560678, out var val))
Console.WriteLine($"{(TestMessageWithCustomOptions.Types.AnEnum)edv.Number}, {edv.Name}, {val}");
}
Я получаю ожидаемую строку:
Val2, ANENUM_VAL2, 123
Но мне все еще нужно это 1560678
в 2 местах, одно в файле прото и другое в моем собственном коде C #, что явно мешает в обслуживании. Нет ли способа на самом деле получить это значение из обработанного дескриптора файла? Я исследовал классы, но не смог его найти.