我正在尝试创建一个函数来自动解析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应该允许我获得正确的解析器。
让这个工作的正确方法是什么?或者如果没有,是否有办法在不声明类型的情况下使用泛型?
答案 0 :(得分:0)
你可以尝试:
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() }
};
您使用通用的角度是什么?