编码我想要的内容的一种方法是以下内容,但我并不喜欢新的隐藏
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);
}
}
答案 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);
}
}