gpt4 book ai didi

c# - 如何创建带有嵌套 T 的泛型方法?

转载 作者:行者123 更新时间:2023-11-30 13:28:27 27 4
gpt4 key购买 nike

我有一个通用的扩展方法

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com