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>();
}
Другие вопросы по тегам