C#的泛型包含空集合

时间:2017-03-07 17:12:03

标签: asp.net caching collections null protobuff.net

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);
}

如果TList<int>且值为零,则会返回一个空列表(因为data == null它将返回default(List<int>))。

如果TDictionary<bool, Hashset<int>,其中存在两个密钥truefalse,但相应的哈希集中没有值,则密钥存在,但值为{{ 1}}。

有没有办法确定null 是否包含集合,如果是,则返回空集合而不是null如果集合为空?优选地,它将在对象中的任何地方检查空集合,而不仅仅是T本身是包含集合的集合。

另一种选择(我现在正在做的)是当我从缓存中获取非常理想的时候知道显式类型时,尝试记住检查空值。

2 个答案:

答案 0 :(得分:1)

您可以使用typeof运算符。

if(typeof(T)== typeof(Dictioneary))
{
  return whatever you want;
}

答案 1 :(得分: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>();
}