C# 如何实现Fluent API - 链式调用的优雅设计

发布时间 - 2026-01-24 00:00:00    点击率:
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 的关键在于“返回可继续操作的对象”,配合清晰命名和合理结构,能让调用代码像自然语言一样流畅。设计时注意职责分离、避免过度嵌套,才能真正实现优雅与实用并存。不复杂但容易忽略。


# c#  # ai  # 邮箱  # 构造函数  # 接口  # class  # public  # private  # 泛型  # 对象  # this  # 链式  # 自然语言  # 链中  # 能让  # 并可  # 可通过  # 更具  # 完后  # 关键在于  # 基本原理 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  手机软键盘弹出时影响布局的解决方法  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  C#如何调用原生C++ COM对象详解  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  微信小程序 canvas开发实例及注意事项  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  简历没回改:利用AI润色让你的文字更专业  想要更高端的建设网站,这些原则一定要坚持!  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Android中AutoCompleteTextView自动提示  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Java解压缩zip - 解压缩多个文件或文件夹实例  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何在服务器上配置二级域名建站?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  JavaScript如何实现倒计时_时间函数如何精确控制  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  javascript中闭包概念与用法深入理解  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  大连 网站制作,大连天途有线官网?  详解jQuery停止动画——stop()方法的使用  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel怎么使用Intervention Image库处理图片上传和缩放  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel怎么使用artisan命令缓存配置和视图  香港服务器WordPress建站指南:SEO优化与高效部署策略  IOS倒计时设置UIButton标题title的抖动问题  javascript基于原型链的继承及call和apply函数用法分析  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  使用spring连接及操作mongodb3.0实例  EditPlus中的正则表达式实战(6)  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Android okhttputils现在进度显示实例代码  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel如何实现API速率限制?(Rate Limiting教程)  重庆市网站制作公司,重庆招聘网站哪个好?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Swift中循环语句中的转移语句 break 和 continue  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】