Обобщения не золотой молоток. В тех случаях, когда ваша деятельность не является общей, используйте старый добрый объект. Один из таких случаев - кеширование. Кеш, естественно, может содержать разные типы. Я недавно видел эту реализацию обертки кеша
void AddCacheItem<T>(string key, T item, int duration, ICacheItemExpiration expiration)
{
. . . . . . .
CacheManager.Add(cacheKey, item, .....
}
Вопрос: зачем, если CacheManager
берет объект?
Тогда был настоящий хаос в Get
public virtual T GetCacheItem<T>(string cacheKey)
{
return (T)CacheManager.GetData(cacheKey); // <-- problem code
}
Проблема выше в том, что тип значения потерпит крах.
Я исправил метод, добавив
public T GetCacheItem<T>(string cacheKey) where T : class
Потому что мне нравится идея сделать это
var x = GetCacheItem<Person>("X")?
string name = x?.FullName;
Но я добавил новый метод, который позволит также принимать типы значений
public object GetCacheItem(string cacheKey)
Суть в том, что есть использование для object
, особенно при хранении различных типов в коллекции. Или когда у вас есть композиции, в которых могут существовать совершенно произвольные и не связанные объекты, когда вам нужно использовать их в зависимости от типа.