C# C泛型类型约束混乱

C# C泛型类型约束混乱,c#,generics,type-constraints,C#,Generics,Type Constraints,我在泛型类型约束方面遇到问题。我有下面的方法,我正在努力将任何东西传递给childSegments参数,这是我能得到的第一个参数 private void FillSegment<T, TT>(BaseSegment<T> segment, IEnumerable<BaseSegment<TT>> childSegments) where T : class where TT : class {} TT是c

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

private void FillSegment<T, TT>(BaseSegment<T> segment, IEnumerable<BaseSegment<TT>> childSegments)
        where T : class
        where TT : class
    {}
TT是class类型,但我试图传递的列表应该是不同类的组合,而不仅仅是单个类类型,这就是我要撞的墙。我可以通过这个列表:

列表l=新列表

但正如我所说,我需要通过多个课程,我有一个LeadSegment、AccountSegment、ContactSegment等,它们实现了BaseSecgment

理想情况如下:

List<BaseSegment<T>> lst = new List<BaseSegment<T>>();
lst.Add(LeadSegment);
lst.Add(AccountSegment);
lst.Add(ContactSegment);
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);
…并传递它,但您不能创建一个类型在方法内部或外部的列表

有什么想法吗


谢谢

我在理解你想做的事情时遇到了一些困难,但我认为你想做出一些限制

where TT : T
或者

这两种情况都可以实现上述理想情况;但是如果没有进一步的理解…

将BaseSegment作为一个非泛型抽象类,您永远不会直接实例化BaseSegment,是吗?。您的FillSegment签名可以如下所示:

List<BaseSegment<T>> lst = new List<BaseSegment<T>>();
lst.Add(LeadSegment);
lst.Add(AccountSegment);
lst.Add(ContactSegment);
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);
这使您能够使用如下方法:

List<BaseSegment<T>> lst = new List<BaseSegment<T>>();
lst.Add(LeadSegment);
lst.Add(AccountSegment);
lst.Add(ContactSegment);
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);

请注意,鉴于两个实例都派生自BaseSegment,这允许子类与父类具有相同的类型。

我不太明白您想要做什么,如果您想要的只是拥有派生自BaseSegment的类,那么您只需将此约束添加到t中即可:其中t:BaseSegment为什么不创建列表?在FillSegment方法中,可以执行List lst或List lst。只需调用FillSegment…,感谢您的回复,我理解上面的内容,因为它非常有意义,但是,在fill segment方法中,我调用另一个方法来调用另一个库中的类,我的BaseSecgment中有一个T的原因是,当我在EF上下文中动态传递时,另一个库需要这种类型从实体框架中动态选择一个实体。具体段的全部实现了一个Func,我使用它将主键设置为Func JoinFunc{get{return x=>x.LeadID;}},然后在该库中使用它。我只需要一种建立这个列表的方法,我想你可以创建一个具体的非抽象的泛型实现来与另一个库对话,比如GenericSegment,其中T:BaseSegment在上面,你应该能够为另一个库提供一个GenericSegment。