作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通用的扩展方法
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
但是,现在该方法返回一个 ICollection,这迫使我将调用编写为:
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()).ToList();
如何重写我的方法,以便在调用时不需要 .ToList()
?
编辑:似乎有些困惑,所以我会尝试将其清除。我有一个 list 。我想用一个新列表对该列表执行操作。没问题。我想出了如何使用扩展方法返回列表。
但我意识到,嘿,Replace() 中的实际代码并不特定于列表,它可以应用于任何集合。所以我修改了 Replace 以返回一个 ICollection。然后这会强制调用方法看起来像
var newStuff = left.Replace(right).ToList()
或
var newStuff = left.Replace(right).ToArray()
等等
但我不想说 ToList、ToArray 等,我希望方法只是从源对象推断出正确的返回类型。所以我可以说
var newStuff = left.Replace(right);
和 newStuff 将与左边的类型相同。权利也将是相同的类型。
最佳答案
尝试以下操作
public static TCollection Replace<TCollection, TItem>(
this TCollection source,
TCollection newList)
where TCollection : ICollection<TItem>
where TItem : IStateful
这是一个用例示例
interface IStateful { }
class Foo : IStateful { }
static void Test()
{
ICollection<Foo> left = null, right= null;
left.Replace<ICollection<Foo>, Foo>(right);
}
不幸的是,通用参数在这种情况下确实是必需的(无法让类型推断适用于这种特定情况)
编辑
我的回答是基于对问题的一点误读。我认为其目的是将 source
的类型传递给方法的返回类型。进一步重新阅读后,您似乎希望在所有情况下都流过任何源并返回 List
。在这种情况下,我建议您看看 Reed 的回答。
关于c# - 如何创建带有嵌套 T 的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600446/
我是一名优秀的程序员,十分优秀!