C# 泛型类型约束混乱

本文关键字:混乱 约束 泛型类型 | 更新日期: 2023-09-27 17:56:16

我在泛型类型约束方面遇到问题。我有以下方法,并且我正在努力将任何东西传递到 childSegments 参数中,这是我可以获得的第一个参数。

private void FillSegment<T, TT>(BaseSegment<T> segment, IEnumerable<BaseSegment<TT>> childSegments)
        where T : class
        where TT : class
    {}

TT 是类类型,但我试图传入的列表应该是不同类的组合,而不仅仅是单个类类型,这就是我正在撞到的墙。我可以传入此列表:

List<BaseSegment<Lead>> l = new List<BaseSegment<Lead>>();

但就像我说的,我需要传入多个类,我有一个 LeadSegment、AccountSegment、ContactSegment 等(实现BaseSegment<T>)。

理想的情况是这样的:

List<BaseSegment<T>> lst = new List<BaseSegment<T>>();
lst.Add(LeadSegment);
lst.Add(AccountSegment);
lst.Add(ContactSegment);

..并传递它,但我相信您无法在方法内或外部创建具有<T>类型的列表

有什么想法吗?

谢谢

C# 泛型类型约束混乱

使BaseSegment成为一个非泛型抽象类(你永远不会直接实例化BaseSegment吗?)。然后,您的FillSegment签名可能如下所示:

private void FillSegment<TParent>(TParent parent, IEnumerable<BaseSegment> children)
    where TParent : BaseSegment

这使您能够像这样使用该方法:

var parent = new SomeParentSegment(); // SomeParentSegment derives from BaseSegment
var children = new List<BaseSegment>();
children.Add(new LeadSegment()); // LeadSegment derives from BaseSegment
children.Add(new AccountSegment()); // AccountSegment derives from BaseSegment
children.Add(new ContactSegment()); // ContactSegment derives from BaseSegment
FillSegment(parent, children);

请注意,这允许childrenparent属于同一类型,因为两个实例都派生自BaseSegment

我在遵循您想要做的事情时遇到了一点麻烦,但我认为您想进行约束

where TT : T

或。。。

where TT : BaseSegment<T>

这两种情况都实现了上面的"理想方案";但没有进一步的理解......