I am trying to cast a generic type to a non generic one that inherits from it but it fails. Check the code below:
public class Subscription
{
public Subscription(DateTime expiration)
{
Expiration = expiration;
}
public DateTime Expiration { get; set; }
}
public class Subscription<T> : Subscription
{
public T Parameters { get; }
public Subscription(DateTime expiration, T data)
: base(expiration)
{
Parameters = data;
}
}
public class SubscriptionsService
{
private readonly ConcurrentDictionary<int, object> subscriptions;
public SubscriptionsService(ConcurrentDictionary<int, object> subscriptions)
{
this.subscriptions = subscriptions;
}
public void Add<T>(int clientId, DateTime expiration, T parameters)
{
if (!subscriptions.TryGetValue(clientId, out var outObject))
{
Subscription<T> subscription = new Subscription<T>(expiration, parameters);
List<Subscription<T>> clientSubscriptions = new List<Subscription<T>>()
{
subscription
};
subscriptions.AddOrUpdate(clientId, parameters, (k, v) => parameters);
}
else
{
if (outObject is List<Subscription<T>> resourceSubscriptions && resourceSubscriptions.Any())
{
Subscription<T> subscription = resourceSubscriptions.SingleOrDefault(x => x.Parameters.Equals(parameters));
if (subscription == null)
{
subscription = new Subscription<T>(expiration, parameters);
resourceSubscriptions.Add(subscription);
}
else
{
subscription.Expiration = expiration;
}
}
}
}
public void Cleanup()
{
// Iterate through each reportId subscription
foreach (KeyValuePair<int, object> subscriptionKeyValuePair in subscriptions)
{
List<Subscription> subscriptions = (subscriptionKeyValuePair.Value as List<Subscription>);
if (subscriptions == null || !subscriptions.Any())
continue;
foreach (var subscription in subscriptions)
{
if (subscription.Expiration > DateTime.Now)
{
//some code
}
}
}
}
}
When I call the method Cleanup and iterate through the keyvalue pairs I am trying to cast the values of the dictionary to the non-generic type that I use to add it to the Add Method. I add as List> and try to cast it as List in order to use the only the Expiration property as I dont need the T Parameters inside Cleanup. As a result List<Subscription> subscriptions
casts fails and ```susbcriptions`` is always null even if value in the dictionary is not.