c# - 流利类的通用 'TThis'

标签 c# generics fluent fluent-interface

我正在构建一个流畅的接口(interface),其中我有一个包含大量流畅逻辑的基类,以及一个添加了一些特殊行为的派生类。我面临的问题是从派生类型的实例调用时基类中流畅方法的返回类型。调用基类的方法后,只有基类的方法可以继续流畅调用。

改变调用方法的顺序将有助于它的编译,但它会降低它的可读性,这是流畅接口(interface)的要点。有没有办法为基类定义某种“This”类型,以便所有方法返回相同的类型。

例子

public class Field<T>
{
    public Field<T> Name( string name )
    {
        _name = name;
        return this;
    }
}

public SpecialField<T> : Field<T>
{
    public SpecialField<T> Special(){ return this; }
}


// !!! Arrgh. Special is not a member of the Field<T> class.
var specialField = new SpecialField()
    .Name( "bing" )
    .Special();

splinter 的解决方案

我已经尝试通过执行类似以下操作来解决它,但它不是有效的 C# :( 但至少表达了我想如何编写接口(interface)代码。

public class Field<T,TThis> : TThis
    where TThis : Field<T,TThis>
{
    public TThis Name( string name ){...}
}

public SpecialField<T> : Field<T,SpecialField<T>>
{
    public TThis Special(){ return this; }
}

最佳答案

在研究了其他一些 Fluent 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();

关于c# - 流利类的通用 'TThis',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677938/

相关文章:

c# - 如何在 .net 3.5 trackbar 中标记最小、最大、中心刻度?

c# 如何将泛型类型参数转换并传递给内部函数?

generics - 在 F# 中强制内部 DSL 的现有类型

c# - 为什么我必须转换为类型参数而不能使用受约束的类型?

c# - EF核心: Method 'ProcessModelFinalized' does not have implementation

java - 默认通用类型

php - 如何在 Laravel Fluent 中进行类型转换?

c++ - 方法链接与多态性 C++

mysql - 使用 Laravel Fluent 在 MySQL 数据库中搜索可变数量的术语

c# - C# 类型如何工作?