0

ジェネリック型の制約に問題があります。私は以下の方法を持っていますが、最初のパラメーターである 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>..そしてそれを渡しますが、メソッド内またはメソッド外のタイプのリストを作成することはできません

何か案は?

ありがとう

4

2 に答える 2

1

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は と同じ型にすることができることに注意してください。parentBaseSegment

于 2013-01-28T17:32:01.953 に答える
0

私はあなたがやりたいことを追うのに少し苦労していますが、あなたは自分の制約を作りたいと思っています

where TT : T

また...

where TT : BaseSegment<T>

これらのシナリオは両方とも、上記の「理想的なシナリオ」を実現します。しかし、それ以上の理解なしに...

于 2013-01-28T17:01:48.293 に答える