ProtoBuf的未知通用参数

时间:2015-09-25 12:43:51

标签: c# generics protocol-buffers

我正在尝试创建一个函数来自动解析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应该允许我获得正确的解析器。

让这个工作的正确方法是什么?或者如果没有,是否有办法在不声明类型的情况下使用泛型?

1 个答案:

答案 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() }
};

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