3

次のような基本型制約を持つ静的ジェネリック型を作成できるようにしたいと思います

public static class Manager<T> where T : HasId
{
    public static T GetSingleById(ref List<T> items, Guid id)
    {
        // the Id is a property provided by HasId
        return (from i in items where i.Id == id select i).SingleOrDefault();
    }
}

次に、別のメソッドを追加します

...
    public static IEnumerable<T> GetManyByParentId(ref List<T> items, Guid parentId) where T : HasIdAndParentId
    {
        // the parentId is a property of HasIdAndParentId which subclasses HasId
        return from i in items where i.ParentId == parentId select i;
    }
...

HasIdAndParentIdはHasIdをサブクラス化するため、制約T:HasIdは満たされますが、コンパイラーはメソッドのwhere基本型制約を受け入れません。

何か案は?

4

3 に答える 3

7

この場合、メソッドの型パラメーターを再定義していないため、新しい制約を適用することはできません。次の方法で実行できるはずです。

public static IEnumerable<T2> GetManyByParentId<T2>(
    ref List<T2> items, Guid parentId) 
    where T2 : T, HasIdAndParentId { .. } 
于 2010-08-13T15:21:43.943 に答える
1

メソッドGetManyByParentId自体をジェネリックにし、そのジェネリック パラメータをT次のように結び付けます。

public static IEnumerable<R> GetManyByParentId<R>(
                                    ref List<R> items, Guid parentId) 
       where R : T, HasIdAndParentId 
于 2010-08-13T15:20:06.807 に答える
0

Ben M のコード サンプルは、名前から判断すると、HasIdAndParentId がインターフェイス タイプでない限りコンパイルされません。

2 番目のメソッド自体をジェネリックにし、独自の型パラメーター (T とは異なる) に依存するようにすると、必要な制約が得られます。

public static IEnumerable<T1> GetManyByParentId<T1>(ref List<T1> items, Guid parentId) where T1 : HasIdAndParentId
{
    // the parentId is a property of HasIdAndParentId which subclasses HasId
    return from i in items where i.ParentId == parentId select i;
}
于 2010-08-13T15:20:20.050 に答える