Joh*_*ohn 3 c# generics extension-methods
我有一个通用的扩展方法
public static IList<T> Replace<T>(this IList<T> source, Ilist<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)
我打电话使用
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff());
Run Code Online (Sandbox Code Playgroud)
但我意识到,我的方法适用于实现ICollection的所有集合,因此我将其更改为
public static ICollection<T> Replace<T>(this ICollection<T> source, ICollection<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)
但是,现在该方法返回IColllection,这迫使我将调用写为:
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()).ToList();
Run Code Online (Sandbox Code Playgroud)
如何重新编写我的方法,以便我不需要.ToList()
打电话?
编辑:有些混乱,所以我会尝试清理它.我有一份清单.我想用新列表在该列表上执行操作.没问题.我想出了如何使用扩展方法返回List.
但是我意识到,嘿,Replace()中的实际代码并不特定于Lists,它可以应用于任何集合.所以我修改了Replace以返回ICollection.这会强制调用方法看起来像
var newStuff = left.Replace(right).ToList()
Run Code Online (Sandbox Code Playgroud)
要么
var newStuff = left.Replace(right).ToArray()
Run Code Online (Sandbox Code Playgroud)
等等
但我不想说ToList,ToArray等,我希望该方法只是从源对象推断出正确的返回类型.所以我可以说
var newStuff = left.Replace(right);
Run Code Online (Sandbox Code Playgroud)
和newStuff的类型与左边相同.右边也是同一类型.
请尝试以下方法
public static TCollection Replace<TCollection, TItem>(
this TCollection source,
TCollection newList)
where TCollection : ICollection<TItem>
where TItem : IStateful
Run Code Online (Sandbox Code Playgroud)
这是一个用例示例
interface IStateful { }
class Foo : IStateful { }
static void Test()
{
ICollection<Foo> left = null, right= null;
left.Replace<ICollection<Foo>, Foo>(right);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这种情况下,通用参数似乎是必要的(无法获得类型推断以适用于此特定方案)
编辑
我的回答是基于对这个问题的一些误读.我认为其目的是将source
类型转换为方法的返回类型.进一步重新阅读虽然看起来你想要流动任何来源并List
在所有情况下返回.在这种情况下,我建议你看看里德的答案.
归档时间: |
|
查看次数: |
262 次 |
最近记录: |