【发布时间】:2018-03-10 06:30:42
【问题描述】:
我正在尝试将泛型类型转换为继承自它的非泛型类型,但它失败了。检查下面的代码:
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
}
}
}
}
}
当我调用方法 Cleanup 并遍历键值对时,我试图将字典的值转换为我用来将其添加到 Add 方法的非泛型类型。我添加为 List> 并尝试将其转换为 List 以使用唯一的 Expiration 属性,因为我不需要 Cleanup 中的 T 参数。结果List<Subscription> subscriptions 强制转换失败并且 ```susbcriptions` 始终为 null,即使字典中的值不是。
【问题讨论】:
-
为什么
subscriptions是ConcurrentDictionary<int, object>?不应该是ConcurrentDictionary<int, Subscription>吗?无论如何,List<Subscription<T>无法转换为List<Subscription>。 -
只是one 的许多可能的重复
-
看看这个stackoverflow.com/q/48952148/6629297
-
@ZoharPeled ConcurrentDictionary
不能这样,因为每个客户端都有很多订阅(List 并且每个都有不同的参数 -
将
Subscribtion<T>转换为Subscription是一回事,将List<Subscription<T>>转换为List<Subscription>是另一回事。整个讨论最终归结为以下演员,这是不可能的:List<Base> lst = new List<Derived>()