c# – 如何使用嵌套T创建泛型方法?
我有一个通用的扩展方法
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()中的实际代码并不特定于Lists,它可以应用于任何集合.所以我修改了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); } 不幸的是,在这种情况下,通用参数似乎是必要的(无法获得类型推断以适用于此特定方案) 编辑 我的回答是基于对这个问题的一些误读.我认为目的是将源的类型传递给方法的返回类型.进一步重新读取虽然看起来你想要流动任何源并在所有情况下返回List.在这种情况下,我建议你看看里德的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |