C# действительно содержит обобщенную пустую коллекцию
Раздражающее поведение 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);
}
Если T
является List<int>
с нулевыми значениями, это возвратит пустой список (потому что data == null
это вернется default(List<int>)
).
Если T
является Dictionary<bool, Hashset<int>
где два ключа true
а также false
существует, но в соответствующем хэш-наборе нет значений, ключ существует, но значение null
,
Есть ли способ определить, если T
содержит коллекцию, и если да, вернуть пустую коллекцию вместо нуля, если коллекция пуста? Предпочтительно, он будет проверять наличие пустой коллекции в любом месте объекта, а не только в том случае, если T сам является коллекцией, которая содержит коллекцию.
Альтернатива (которую я делаю сейчас) состоит в том, чтобы не забыть проверить нулевые значения, когда я знаю явный тип, когда получаю из кеша, который не идеален.
2 ответа
Вы можете использовать оператор typeof.
if(typeof(T)== typeof(Dictioneary))
{
return whatever you want;
}
Согласно моему комментарию, что-то вроде этого поможет?
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>();
}