1

ProtoBuff.net 的一个恼人行为是空集合被序列化为null. 这可能会产生一些很难确定的错误。

从我的应用程序中检索缓存值是通过以下函数完成的:

public T Get<T>(string cacheKey)
{
    var data = (byte[])Database.StringGet(cacheKey);
    if (data == null)
    {
        return default(T);
    }
    return Serialiser.Deserialise<T>(data);
}

如果TisList<int>的值为零,这将返回一个空列表(因为data == null它将返回default(List<int>))。

如果TDictionary<bool, Hashset<int>,其中两个键truefalse存在但对应的哈希集中没有值,则键存在但值是null

有什么方法可以确定是否T 包含集合,如果集合为空,则返回空集合而不是 null?最好,它会检查对象中任何地方的空集合,而不仅仅是 T 本身是否是包含集合的集合。

另一种方法(我现在正在做的)是当我知道从缓存中获取的显式类型时,尝试记住检查空值,这并不理想。

4

2 回答 2

1

您可以使用 typeof 运算符。

if(typeof(T)== typeof(Dictioneary))
{
  return whatever you want;
}
于 2017-03-07T17:27:34.167 回答
0

根据我的评论,这样的事情会有所帮助吗?

void Main()
{
    Get<int>("cacheKey1").Dump();
    Get<List<string>, string>("cacheKey2").Dump();
    Get<Dictionary<string, string>, KeyValuePair<string,string>>("cacheKey3").Dump();
}

public T Get<T>(string cacheKey)
{
    ...
    return default(T);
}

public IEnumerable<S> Get<T, S>(string cacheKey) where T : IEnumerable<S>
{
    ...
    return Enumerable.Empty<S>();
}
于 2017-03-07T17:35:49.143 回答