Как я могу использовать protobuf Any in C#? - PullRequest
1 голос
/ 09 июля 2020

Вот моя модель данных protobuf:

message GetNewsRespone{
  repeated google.protobuf.Any instrument = 1;
}

message Issue{
  int64 id = 1;
  string title = 2;
}

И вот моя попытка заполнить это данными:

GetNewsRespone res = new GetNewsRespone();
Issue issue = new Issue();
issue.id = 123;
layer.instrument .AddRange(???);

Как я могу добавить Issue к моему GetNewsRespone.instrument, который является массивом Any?

1 Ответ

1 голос
/ 09 июля 2020

У вас есть методы, которые вы можете использовать в C#, предоставляемом классом Any. Приведу пример.

Допустим, у нас есть следующий буфер протокола:

syntax "proto3"

import "google/protobuf/any.proto"

message Stock {
    // Stock-specific data
}

message Currency {
    // Currency-specific data
}

message ChangeNotification {
    int32 id = 1;
    google.protobuf.Any instrument = 2;
}

А в коде C#. Any класс предоставляет методы для установки поля, извлечения сообщение и проверка типа.

public void FormatChangeNotification(ChangeNotification change)
{
    if (change.Instrument.Is(Stock.Descriptor))
    {
        FormatStock(change.Instrument.Unpack<Stock>());
    }
    else if (change.Instrument.Is(Currency.Descriptor))
    {
        FormatCurrency(change.Instrument.Unpack<Currency>());
    }
    else
    {
        throw new ArgumentException("Unknown instrument type");
    }
}

Надеюсь, я помог вам понять, как вы можете реализовать это в своем собственном коде.

...