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>
类型的列表
有什么想法吗?
谢谢
使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);
请注意,这允许children
与parent
属于同一类型,因为两个实例都派生自BaseSegment
。
我在遵循您想要做的事情时遇到了一点麻烦,但我认为您想进行约束
where TT : T
或。。。
where TT : BaseSegment<T>
这两种情况都实现了上面的"理想方案";但没有进一步的理解......