我有以下扩展方法将一个集合中的元素添加到另一个集合中:
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> list)
{
foreach (var item in list)
{
collection.Add(item);
}
}
如果IEnumerable列表与我试图将其添加到的ICollection的类型相同,这可以正常工作。但是,如果我有这样的事情:
var animals = new List<Animal>();
var dogs = new List<Dog>(); // dog is a subclass of animal
animals.AddRange(dogs); // this line has a compiler error, it can't infer the type
如果IEnumerable的类型是T类型的子类(或实现接口),如何修改我的扩展方法以便能够执行此类操作?
答案 0 :(得分:5)
此方法将为您提供所需内容:
public static void AddRange<A,B>(
this ICollection<A> collection,
IEnumerable<B> list)
where B: A
{
foreach (var item in list)
{
collection.Add(item);
}
}
几点说明:
答案 1 :(得分:2)
你可以这样做:
public static void AddRange<T,T2>(this ICollection<T> collection, IEnumerable<T2> list) where T2: T {
foreach (var item in list) {
collection.Add(item);
} }
答案 2 :(得分:1)
等待C# 4.0或使用Linq扩展方法Cast
:
List<Animal> animals = new List<Animal>();
List<Dog> dogs = new List<Dog>();
animals.AddRange(dogs.Cast<Animal>());
答案 3 :(得分:0)
public static void AddRange<TA, TB>(this ICollection<TA> collection,
IEnumerable<TB> list) where TB : TA
(并入Craig Walker的评论)
答案 4 :(得分:0)
我会使用约束来限制类型。
public static void AddRange<T, TK>(this ICollection<T> collection, IEnumerable<TK> list) where TK : T
{
foreach (var item in list)
{
collection.Add(item);
}
}