想要做IGenericInterface <t>,其中T:ISomethingElse <typeof(this)> //i.e。实现类的类型</typeof(this)> </t>

时间:2011-04-27 01:29:41

标签: c# generics where-clause where

我想在我的通用界面的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 个答案:

答案 0 :(得分:6)

这里可以使用奇怪的重复通用模式:

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

但我seriously consider re-evaluating your design。你真的需要吗?

答案 1 :(得分:1)

我认为你唯一的选择是:

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

您只能在通用接口的类型约束中使用类型参数或已知的编译时类型,因此这是您可以做的最好的。

答案 2 :(得分:0)

似乎你想构建一个树结构,其中每个节点都有多个子节点。你可以这样做:

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);
    }
}