在浏览了一些其他流利的API之后,我发现了如何做到这一点。虽然不太干净,但效果很好。基本上,您为要使用的每个派生类型引入一个中间基类,它将“tthis”类型传递给实际的实现。
样品
public class FieldBase<T,TThis>
where TThis : FieldBase<T,TThis>
{
private string _name;
public TThis Name( string name )
{
_name = name;
return (TThis)this;
}
}
public class Field<T> : FieldBase<T,Field<T>>{}
public class SpecialFieldBase<T,TThis> : FieldBase<T,TThis>
where TThis : SpecialFieldBase<T,TThis>
{
public TThis Special(){ return (TThis)this; }
}
public class SpecialField<T> : SpecialFieldBase<T,SpecialField<T>>{}
// Yeah it works!
var specialField = new SpecialField<string>()
.Name( "bing" )
.Special();