Хотите сделать IGenericInterface <T>, где T: ISomethingElse <typeof (this)> //i.e. typeof реализующий класс - PullRequest
0 голосов
/ 27 апреля 2011

Я хочу использовать ключевое слово this или что-то вроде typeof(this) в ограничении where моего универсального интерфейса, но, видимо, это неправильно (не компилируется).Есть ли хитрый способ сделать это, о котором я не знаю?

interface IParent<TChild> where TChild : IChildOf<typeof(this)>
{

    void AddRange(TChild children){}

}

interface IChildOf<TParent> : IDisposable
{
    TParent Parent { get; }
}

Или я должен сделать

interface IParent<TChild, T2> where TChild : IChildOf<T2>

и просто знать, что T2 будет классом, реализующиминтерфейс?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2011

Любопытно повторяющийся шаблон можно использовать здесь:

interface IParent<TChild, TParent>
  where TChild : IChildOf<TParent>
  where TParent : IParent<TChild, TParent>
{
  void AddRange(TChild children);
}

Но я бы серьезно подумал о переоценке вашего дизайна . Вы действительно нуждаетесь в этом?

1 голос
/ 27 апреля 2011

Я думаю, что ваш единственный выбор:

interface IParent<TChild, TParent> where TChild : IChildOf<TParent>
{
    void AddRange(TChild children);
}

Вы можете использовать только параметры типа или известные типы времени компиляции в ограничениях типов для вашего общего интерфейса, так что это лучшее, что вы можете сделать.

0 голосов
/ 27 апреля 2011

кажется, что вы хотите построить древовидную структуру, в которой каждый узел имеет несколько дочерних элементов. Вы можете сделать это так:

interface INode
{
    List<INode> Children { get; }
    void AddRange(IEnumerable<INode> children);
}

class Node : INode
{
    List<INode> Children { get; private set; }

    void AddRange(IEnumerable<INode> children)
    {
        Children.AddRange(children);
    }
}
...