Получить номер поля пользовательской опции из дескриптора в protobuf - PullRequest
0 голосов
/ 12 марта 2019

Я хотел бы создать пользовательские параметры для значений 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 #, что явно мешает в обслуживании. Нет ли способа на самом деле получить это значение из обработанного дескриптора файла? Я исследовал классы, но не смог его найти.

...