带有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应该可以让我得到正确的解析器。
让它工作的正确方法是什么?或者如果没有,有没有一种方法可以使用泛型而不声明类型?
你可以试试:
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() }
};
你使用通用的角度是什么?