复用 Entity Framework 中英语单复数形式变换的类
2011-09-21 21:24 鹤冲天 阅读(4679) 评论(8) 编辑 收藏 举报数据库表名用复数、实体类名用单数,集合属性用复数…编程中经常会遇到英语单复数变换的问题,你能准确处理吗?对我来说,十年前或许可以,but don't worry,我们有现成的类提供些类服务,来自 EntityFrameWork。
使用 ILSpy 打开 EntityFramework.dll(v4.1),处理单复数的相关类位于 System.Data.Entity.ModelConfiguration.Design.PluralizationServices 命名空间下:
其中 PluralizationService 是单复数变换服务的抽象基类,定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
internal abstract class PluralizationService { public CultureInfo Culture { get; protected set; } public abstract bool IsPlural(string word); public abstract bool IsSingular(string word); public abstract string Pluralize(string word); public abstract string Singularize(string word); /// <summary> /// Factory method for PluralizationService. Only support english pluralization. /// Please set the PluralizationService on the System.Data.Entity.Design.EntityModelSchemaGenerator /// to extend the service to other locales. /// </summary> /// <param name="culture">CultureInfo</param> /// <returns>PluralizationService</returns> public static PluralizationService CreateService(CultureInfo culture) { if (culture.TwoLetterISOLanguageName == "en") { return new EnglishPluralizationService(); } throw new NotImplementedException("We don't support locales other than english yet"); } } |
EnglishPluralizationService 是英文的具体实现类,包含了规则变换和不规则变换,代码太长就不贴出了。
估计很多朋友会和我一样会,担心这个实现是否完整。我简单查看了下源码,发现了这个单词:
1
|
pneumonoultramicroscopicsilicovolcanoconiosis |
不用数了,一共是 45 个字母,这可是最长的英语单词。这么长(估计实际用的也不多)的单词都收录了,再加上 EnglishPluralizationService 类 2451 行的代码,想必非常完整了。
但不幸的是,这些类都是 internal,没法直接用。不过我们可以使用 ILSpy 把这几个类提出来,供我们享用。
ILSpy 可以将整个 dll 反编译成项目,也可以将单个类反编译成文件:
但不能直接反编译一个命名空间,有点遗憾。
余下的工作的和怎么用,就不用我多说了吧。
分享一份我处理好的源码:PluralizationServices.rar (8KB,VS2010)
-------------------
思想火花,照亮世界