c# – 如何使用嵌套T创建泛型方法?

c# – 如何使用嵌套T创建泛型方法?,第1张

概述我有一个通用的扩展方法 public static IList<T> Replace<T>(this IList<T> source, Ilist<T> newList) where T:IStateful 我打电话使用 myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()); 但我意识到,我的方法适用于实现I 我有一个通用的扩展方法

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()?

编辑:
有些混乱,所以我会试着清理它.我有一份清单.我想用新列表在该列表上执行 *** 作.没问题.我想出了如何使用扩展方法返回List.

但是我意识到,嘿,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.在这种情况下,我建议你看看里德的答案.

总结

以上是内存溢出为你收集整理的c# – 如何使用嵌套T创建泛型方法?全部内容,希望文章能够帮你解决c# – 如何使用嵌套T创建泛型方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221822.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存