
开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载导读Dehumanize是 Humanizer 中与Humanize恰好相反的核心扩展方法它把带空格的人类可读字符串例如some string、Title Case Sentence重新还原为无空格、每词首字母大写的 PascalCase 标识符适用于将 UI 文本、配置值或数据库中的展示字符串转换为 .NET 类型名、属性名或枚举成员名。本文以 StringDehumanizeExtensions 类文档 为骨架结合仓库中的源码实现与测试用例带你完整掌握该方法的调用方式、内部工作原理、边界行为与实战场景。一、方法概览签名、参数与返回值StringDehumanizeExtensions是一个静态扩展类包含一个公开方法Dehumanize。其 API 签名如下public static string Dehumanize(this string input);成员说明类public static class StringDehumanizeExtensions位于 src/Humanizer/StringDehumanizeExtensions.cs命名空间Humanizer需在代码中using Humanizer;参数input待反人类化的字符串必须非 null传 null 会抛出ArgumentNullException返回值PascalCase 字符串移除全部空格、每个单词首字母大写若输入本身不含空格已是 PascalCase则原样返回该方法是Humanize(this string)的逆操作二者互为可逆变换——Humanize负责把 PascalCase 标识符拆成可读的带空格文本而Dehumanize负责把带空格文本重新拼回 PascalCase 标识符。它同时会复用Pascalize()来自 InflectorExtensions因此对下划线、短横线、点号等分隔符也有一定的清理能力详见下文内部实现。二、官方示例与行为验证方法文档给出的四个标准示例完整覆盖了不同输入形态some string.Dehumanize() // SomeString Some String.Dehumanize() // SomeString Some string.Dehumanize() // SomeString SomeStringAndAnotherString.Dehumanize() // SomeStringAndAnotherString // 已反人类化原样返回从示例可以看到三个关键行为大小写不敏感的词首大写无论原词是小写、大写还是混合大小写some/Some每个词的首字母都被统一提升为大写其余字母的处理交给Pascalize。空格被完全移除多个单词被无分隔地拼接成一个标识符。幂等性输入已是不含空格的 PascalCase 字符串时方法直接返回原字符串不会二次改动。仓库中的测试 StringDehumanizeTests.cs 用TheoryInlineData对这些行为做了系统验证例如[InlineData(Pascal case sentence is pascalized, PascalCaseSentenceIsPascalized)] [InlineData(Title Case Sentence Is Pascalized, TitleCaseSentenceIsPascalized)] [InlineData(lower case sentence is pascalized, LowerCaseSentenceIsPascalized)] [InlineData(AlreadyDehumanizedStringIsUntouched, AlreadyDehumanizedStringIsUntouched)] [InlineData(OneAndTwo, OneAndTwo)]注意OneAndTwo这类输入也原样返回Dehumanize只负责去除空格与词首大写不会对And、Or、Of、But、As、So、Nor、Yet这类连接词做任何拆词或改写——这正是它与Pascalize底层正则行为一致的结果确保标识符拼接是确定性的。三、内部实现四步流水线拆解源码实现 非常精简可以拆成四条规则public static string Dehumanize(this string input) { var words input.Split( , StringSplitOptions.RemoveEmptyEntries); if (words.Length 0) { return input; } if (words.Length 1) { return words[0].Humanize().Pascalize(); } return string.Concat(words.Select(word word.Humanize().Pascalize())); }1. 以空格切分并自动清理空段input.Split( , StringSplitOptions.RemoveEmptyEntries)只以单个空格字符作为分隔符并使用RemoveEmptyEntries丢弃连续空格产生的空项。也就是说Some string多个连续空格与Some string结果相同。若输入全为空格切分后words.Length 0方法直接返回原始输入例如 原样返回。2. 对每个单词先执行Humanize()这是文档 Remarks 中强调的处理边界情况步骤。每个词先走 StringHumanizeExtensions.Humanize 的完整规则链包括全大写输入如HTML返回原样除非通过Vocabularies.Default.AddAcronym(iOS)之类的注册做了规范化处理见 Vocabularies.cs 与 Vocabulary.cs 的ApplyAcronyms/NormalizeAcronyms拆解下划线、短横线分隔的词拆解内嵌的 PascalCase / camelCase 文本。这意味着即使某个单词内部混有_、-或大小写边界Dehumanize也能在最终拼接前把它规整为一个干净的词。3. 对每个单词执行Pascalize()词首大写与去分隔符由 InflectorExtensions.Pascalize 完成优先走 ASCII 快速路径否则回退到正则PascalizePattern (?:[ _.-]|^)(.)?见 InflectorExtensions.cs把空格 / 下划线 / 短横线 / 点号之后的首字符转成大写并移除这些分隔符。因此some_string.Dehumanize() // SomeString some-string.Dehumanize() // SomeString some.string.Dehumanize() // SomeString4. 使用string.Concat无分隔拼接多个单词各自完成Humanize().Pascalize()后直接string.Concat拼接没有任何分隔符插入最终产出 PascalCase 标识符。四、单参数与多参数分支为什么代码要区分words.Length实现中有一个容易被忽略的设计细节words.Length 1与words.Length 1是两个分支但逻辑完全相同——都是word.Humanize().Pascalize()区别仅在是否经过string.Concat的包装。从源码结构看可以推断这更多是为了语义清晰与极端情况兜底单参数分支直接返回处理结果避免无谓的 Concat 开销而多参数分支则统一走批量拼接。对调用者而言两个分支对外行为一致无需感知。五、边界情况与注意事项综合源码与测试实际使用时需要注意以下几点场景行为输入为null抛出ArgumentNullException方法约定Must not be null输入为空串Split得到空数组走words.Length 0分支返回输入全为空格切分后无有效单词原样返回输入输入已有 PascalCase无空格单单词分支处理若本就规范返回原串幂等多空格/混合大小写空格冗余被清理词首统一大写词内含_、-、.会被Pascalize一并移除并大写后续字母连接词And/Or/Of/So 等保持原词不做拆词或缩写处理典型用途把用户可见的标题如Order status、枚举项的展示文本或国际化文案反推成代码标识符类型名、属性名、枚举成员或作为Humanize的配套逆变换实现展示 ↔ 标识符的双向转换。六、与相关 API 的关系Dehumanize不是孤立存在的它位于 Humanizer 字符串转换生态的枢纽位置StringHumanizeExtensions.Humanize(string)逆操作。SomeString.Humanize()→Some stringsome string.Dehumanize()→SomeString。两者互为往返round-trip但需注意往返并非对任意输入都严格对称——Humanize会拆词并小写化而Dehumanize只会去空格与词首大写。InflectorExtensions.Pascalize()底层依赖。若你只需要去分隔符 词首大写可以绕过Humanize步骤直接使用PascalizeDehumanize则在Pascalize之前额外补了一次Humanize以规范化每个单词的大小写与内嵌边界。CasingExtensions/StringHumanizeExtensions.Humanize(string, LetterCasing)Humanize的重载允许指定LetterCasing.AllCaps/LowerCase/Title等目标大小写Dehumanize固定产出 PascalCase不接受 casing 参数。更多字符串类 API 可参考同目录下的 Humanizer.StringHumanizeExtensions.md 与 Humanizer.InflectorExtensions.md。七、快速上手示例在项目中引用 Humanizer 包后例如dotnet add package Humanizer即可在任意字符串上直接调用using Humanizer; // 基础用法 var a some string.Dehumanize(); // SomeString var b Pascal case sentence.Dehumanize(); // PascalCaseSentence // 与 Humanize 配合实现双向转换 var id OrderStatus.Humanize(); // Order status var back id.Dehumanize(); // OrderStatus // 处理标题类文本含标点会被保留吗——标点不会参与大写 var c A special character is removed?.Dehumanize(); // ASpecialCharacterIsRemoved其中最后一个示例对应测试用例 StringDehumanizeTests.cs 中的A special character is removed?词首大写规则只作用于每个词的首字母行尾的?等标点不会产生新的词因此被自然丢弃若标点紧跟空格之后形成独立 token则行为可能不同参见测试A special character is removed after a space ?的用例设计。结语StringDehumanizeExtensions.Dehumanize虽然只是一个十余行的方法却是 Humanizer 中可读文本 ↔ 代码标识符双向转换链条的关键一环。理解它的四步流水线空格切分 → 逐词 Humanize → 逐词 Pascalize → 无分隔拼接、幂等特性和与Humanize的逆运算关系能帮你在枚举展示、类型名还原、配置文本规范化等场景中写出既稳健又符合 .NET 命名规范的代码。源码与测试都集中在 src/Humanizer/StringDehumanizeExtensions.cs 与 tests/Humanizer.Tests/StringDehumanizeTests.cs值得进一步阅读。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Humanizer 字符串反人性化用 StringDehumanizeExtensions.Dehumanize 把可读文本还原为 PascalCase 标识符Humanizer 字符串反人性化用 StringDehumanizeExtensions.Dehumanize 把可读文本还原为 PascalCase 标识开发工具Humanizer 字符串反人类化Dehumanize将可读文本还原为 PascalCase 标识符的完整指南Humanizer 字符串反人类化Dehumanize将可读文本还原为 PascalCase 标识符的完整指南 导读 本文聚焦 .NET 库 Humani开发工具Humanizer 字符串去人类化Dehumanize将可读文本还原为 PascalCase 标识符的完整指南Humanizer 字符串去人类化Dehumanize将可读文本还原为 PascalCase 标识符的完整指南 导读 Humanizer 是 .NET 生开发工具上一篇pyasc 项目文档体系全览从环境搭建、算子开发到调试调优的完整技术路线下一篇Flower 框架退出码 605COMMON_TLS_SERVER_CERTIFICATES_INVALID排查指南TLS 服务端证书配置不完整创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考