2017-03-07 4 views
1

ProtoBuff.netの厄介な動作は、空のコレクションがnullとしてシリアル化されていることです。これはバグをピン止めするのにかなり難しいことがあります。私のアプリケーションからのキャッシュされた値のC#には空のコレクションが含まれています

検索は、次の関数で行われます。

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

Tがゼロの値を持つList<int>であれば(それはdefault(List<int>)を返しますdata == nullので)、これは空のリストを返します。 Tは、2つのキーtruefalseが存在Dictionary<bool, Hashset<int>、であるが、対応するHashSetのに値がない

場合は値がnullであるが、キーが存在します。

Tにコレクションが含まれているかどうかを判断する方法はありますか?その場合、コレクションが空の場合はnullの代わりに空のコレクションを返しますか?好ましくは、T自体がコレクションを含むコレクションではなく、オブジェクトのどこかで空のコレクションをチェックすることが好ましい。

私が今行っている選択肢は、理想的ではないキャッシュから取得したときに明示的な型を知っているときに、nullをチェックすることを忘れないようにすることです。

+0

Getを呼び出すときに期待しているタイプを知っていますか?もしそうなら、この場合に過負荷がある。 – Phil

答えて

1

typeof演算子を使用できます。

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

私はすべてのケースをカバーするより一般的なアプローチを行っています –

+0

メソッドに2番目の引数としてデフォルト値を指定すると便利です。 – Luci

+0

Like 'public T Get (string cacheKey、T defaultValue)' – Luci

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>(); 
} 
関連する問題