C#中实现Fluent API的核心是方法链式调用,通过返回this或新上下文对象(如Builder、条件分支后的ActionBuilder)提升可读性;常用场景包括计算链、对象构建、条件配置,并可通过接口泛型增强类型安全与调用顺序引导。

在 C# 中实现 Fluent API,核心是让每个方法调用后返回当前对象(或下一个上下文对象),从而支持链式调用。这种设计常见于构建器模式、查询构造、配置设置等场景,能显著提升代码的可读性和表达力。
1. 基本原理:返回 this
Fluent API 的基础是每个方法操作完后返回 this,允许连续调用其他方法。
public class Calculator
{
private int _value;
public Calculator(int start = 0) => _value = start;
public Calculator Add(int x)
{
_value += x;
return this; // 返回当前实例
}
public Calculator Multiply(int x)
{
_value *= x;
return this;
}
public int Result() => _value;}
使用方式简洁流畅:
var result = new Calculator(5)
.Add(3)
.Multiply(2)
.Result(); // 结果为 16
2. 使用 Builder 模式构建复杂对象
Fluent API 常用于对象构建,避免构造函数参数过多。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public override string ToString() => $"{Name}, {Age}岁, 邮箱: {Email}";}
public class PersonBuilder
{
private readonly Person _person = new();
public PersonBuilder SetName(string name)
{
_person.Name = name;
return this;
}
public PersonBuilder SetAge(int age)
{
_person.Age = age;
return this;
}
public PersonBuilder SetEmail(string email)
{
_person.Email = email;
return this;
}
public Person Build() => _person;}
调用示例:
var person = new PersonBuilder()
.SetName("张三")
.SetAge(28)
.SetEmail("zhangsan@example.com")
.Build();
3. 支持上下文切换的高级 Fluent 接口
某些场景需要在链中切换上下文,比如配置一个动作的条件和结果。
public class ConditionBuilder
{
private bool _condition;
public ConditionBuilder When(bool condition)
{
_condition = condition;
return this;
}
public ActionBuilder Then(Action action)
{
if (_condition) action();
return new ActionBuilder(); // 返回新上下文
}}
public class ActionBuilder
{
public ActionBuilder AndThen(Action action)
{
action();
return this;
}
public void Done() { /* 结束链 */ }}
使用方式更具表达性:
new ConditionBuilder()
.When(DateTime.Now.Hour > 12)
.Then(() => Console.WriteLine("下午了"))
.AndThen(() => Console.WriteLine("继续工作"))
.Done();
4. 利用泛型和接口优化类型安全
通过接口约束方法可见性,防止用户在不该调用的地方调用某些方法。
public interface ICanAdd { Calculator Add(int x); }
public interface ICanMultiply { Calculator Multiply(int x); }
public interface ICanGetResult { int Result(); }
public class Calculator : ICanAdd, ICanMultiply, ICanGetResult
{
private int _value;
public Calculator(int start = 0) => _value = start;
public Calculator Add(int x)
{
_value += x;
return this;
}
public Calculator Multiply(int x)
{
_value *= x;
return this;
}
public int Result() => _value;}
虽然 C# 不强制限制链中顺序,但可通过接口组合引导正确使用方式。
基本上就这些。Fluent API 的关键在于“返回可继续操作的对象”,配合清晰命名和合理结构,能让调用代码像自然语言一样流畅。设计时注意职责分离、避免过度嵌套,才能真正实现优雅与实用并存。不复杂但容易忽略。










