gpt4 book ai didi

c# - 泛型方法如何返回所有类型 T

转载 作者:行者123 更新时间:2023-12-03 05:36:31 24 4
gpt4 key购买 nike

假设我有以下代码:

public class Pond
{
public List<Frog> Frogs { get; set; }
public List<MudSkipper> MudSkippers { get; set; }
public List<Eel> Eels { get; set; }
}

public class Frog: IAquaticLife
{

}



public class MudSkipper: IAquaticLife
{

}



public class Eel: IAquaticLife
{

}

现在我想编写一个通用方法,该方法将为某个池塘返回这些类型的列表:

public IEnumerable<T> GetByPond<T>(int pondId) where T : IAquaticLife
{
return Uow.GetByID<Pond>(pondId).Eels;
}

好的,所以我所拥有的将返回该池塘中的所有鳗鱼。我想做的是返回所有 T。

所以如果我打电话GetByPond<MudSkipper>(1)这将返回所有弹涂鱼。

有人知道怎么做吗?

最佳答案

像这样的东西怎么样

public IEnumerable<T> GetByPond<T>(int pondId) where T : IAquaticLife
{
return from t in Uow.GetByID<Pond>(pondId).AquaticLife()
where (typeof(t) == typeof(T)) select t;
}

或者简单地(使用@DStanley在更改答案之前指出的方法)

public IEnumerable<T> GetByPond<T>(int pondId) where T : IAquaticLife
{
return Uow.GetByID<Pond>(pondId).AquaticLife().OfType<T>();
}

这需要Uow.GetByID(int id)返回特定池塘中实现IAquaticLife的所有类型的生物。不过,另一种方法是将 IAquaticLife 的各种实现者的知识硬编码到您的通用方法中。这不是一个好主意。

更新

目前池塘有单独的鳗鱼弹涂鱼等集合。如果您想添加更多实现的东西,这会变得脆弱em>IAquaticLife 随着代码的发展,因为您必须更改 Pond 和上面的通用方法。

我建议不要为每种类型的水生生物使用单独的方法,而是使用一个方法来返回实现IAquaticLife的池塘中的所有内容,例如

public class Pond
{
public IEnumerable<IAquaticLife> AquaticLife() { ... }
}

我已经根据这个假设更新了上面的代码。

任何拥有 Pond 实例并且想要获得(比如说)鳗鱼的人都可以这样做:

var eels = pond.AquaticLife().OfType<Eels>();

关于c# - 泛型方法如何返回所有类型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152120/

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