在c#中有没有任何方法可以包含自己包含的Type?

时间:2015-02-13 00:24:19

标签: c# generics

编码我想要的内容的一种方法是以下内容,但我并不喜欢新的隐藏

public class Bar
{
    public TReturn Baz<TReturn>()
      where TReturn : Bar
    {
        return this as TReturn;
    }
}

public class Foo : Bar
{
    public new TReturn Baz<TReturn>()
      where TReturn : Foo
    {
        return base.Baz<TReturn>() as TReturn;
    }
}

class Test
{
    public void Main()
    {
      var foo = new Foo();
      var foo2 = foo.Baz<Foo>();
      Assert.IsInstanceOfType(foo.GetType(), foo2);
    }
}

相反,我想知道泛型类型是否可以包含自身?如下所示。

public class Bar<TReturn>
    where TReturn : Bar<TReturn>
{
    public TReturn Baz()
    {
        return this as TReturn;
    }
}

public class Foo<TReturn> : 
    Bar<TReturn>
    where TReturn : Bar<TReturn>
{
}

class Test
{
    public void Main()
    {
      var foo = new Foo<???>();
      var foo2 = foo.Baz();
      Assert.IsInstanceOfType(foo.GetType(), foo2);
    }
}

2 个答案:

答案 0 :(得分:4)

你应该看看这个: Article by Eric Lippert 他在某种程度上解释了这种模式,它是Curiously recurring template pattern

的变体

答案 1 :(得分:1)

感谢Dog Ears提供的模式名称和初步提示。

作为参考,我目前的解决方案是清理Foo,因此它不需要传入类型。

public class Bar<TReturn>
    where TReturn : Bar<TReturn>
{
    public TReturn Baz()
    {
        return this as TReturn;
    }
}

public class Foo : Bar<Foo>
{
}

class Test 
{
    public void Main()
    {
        var foo = new Foo();
        var foo2 = foo.Baz();
        Assert.IsInstanceOfType(foo.GetType(), foo2);
    }
}