【发布时间】:2011-04-08 20:28:53
【问题描述】:
我有一个通用的扩展方法
public static IList<T> Replace<T>(this IList<T> source, Ilist<T> newList) where T:IStateful
我用
调用myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff());
不过,我意识到我的方法适用于所有实现 ICollection 的集合,因此我将其更改为
public static ICollection<T> Replace<T>(this ICollection<T> source, ICollection<T> newList) where T:IStateful
但是,现在该方法返回一个 IColllection,这迫使我将调用编写为:
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()).ToList();
如何重新编写我的方法,以便在我的通话中不需要.ToList()?
编辑: 似乎有些混乱,所以我会尝试清除它。我有一个清单。我想使用新列表对该列表执行操作。没问题。我想出了如何使用扩展方法返回一个列表。
但我意识到,嘿,Replace() 中的实际代码并不特定于列表,它可以应用于任何集合。所以我修改了 Replace 以返回一个 ICollection。这会强制调用方法看起来像
var newStuff = left.Replace(right).ToList()
或
var newStuff = left.Replace(right).ToArray()
等等
但是我不想说 ToList、ToArray 等,我希望方法只是从源对象中推断出正确的返回类型。所以我可以说
var newStuff = left.Replace(right);
和 newStuff 将与 left 的类型相同。 Right 也属于同一类型。
【问题讨论】:
-
myStatefulSetOfStuff 是什么类型?
-
source和newList必须是同一类型吗?或者只要两种类型都实现ICollection<T>,它们可以是单独的类型吗? -
source 和 newList 将属于同一类型。
标签: c# generics extension-methods