带有ProtoBuf的未知通用参数

本文关键字:参数 未知 ProtoBuf 带有 | 更新日期: 2023-09-27 18:14:35

我试图创建一个函数来自动解析protobuf字节数组并返回一个对象,无论类型如何。所有的protobuf类都扩展了IMessage接口,所以我应该能够返回IMessage类型。

public IMessage Deserialize(int key, byte[] bytes) 
{ ... }

在Java中,我只是按键跟踪所有解析器,并在需要时拔出正确的解析器:

public final Map<Integer, Parser<? extends Message>>  parsersByKey
    = new HashMap<Integer, Parser<? extends Message>> () {{
        put(1, HiMessage.parser());
    }};

public Message parser(int key, byte[] data) {
    Parser<? extends Message> parser = parsersByKey.get(key);
    Message message = parser.parseFrom(data);
    return message;
}

但是在c#中我有两个问题:

  • 我不能存储解析器字典,因为没有匿名类型:IDictionary<int, IMessage<?>>(不编译)。
  • 即使我可以存储在字典中,我也很难定义一个MessageParser<??> parser = ...来进行解析。

因为它们都是相同的类型家族(IMessage),我应该能够做到这一点。每个解析器都知道如何解析它的类型,使用int和key应该可以让我得到正确的解析器。

让它工作的正确方法是什么?或者如果没有,有没有一种方法可以使用泛型而不声明类型?

带有ProtoBuf的未知通用参数

你可以试试:

public readonly Dictionary<Integer, Parser<IMessage>> parsersByKey = new Dictionary<Integer, Parser<IMessage>>
{
    {1, new HiMessage()}
};

但这将减轻对通用的需求。这可能导致:

public interface IParser 
{
    Message parseFrom(byte[] data);
}
public readonly Dictionary<int, IParser>  parsersByKey= new Dictionary<int, IParser>
{
    {1, new HiMessageParser() }
};

你使用通用的角度是什么?