1.参数检查
对于写库的大多数人来说,参数检查是一件极其麻烦的事情,我们需要重复写以下代码:
1public void Foo(string name)
2{
3 if(name == null) throw new ArgumentNullException("name");
4}
现在我们有了扩展方法,则可以这样:
1/// <summary>
2/// 参数检查扩展方法类
3/// </summary>
4public static class RequireExtension
5{
6 public static void RequireNotNull(this object obj, string name)
7 {
8 if(name == null) throw new ArgumentNullException("name");
9 if(obj is null) throw new ArgumentNullException(name);
10 }
11}
12
13// 示例
14public void Foo(string name)
15{
16 name.RequireNotNull("name");
17}
2.本地化
当我们使用枚举,经常需要在枚举和本地化字符串之间转换,或者编码规范为英文,需要将枚举转换为中文,扩展方法可以让我们这样。
1/// <summary>
2/// 本地化后的友好名称
3/// </summary>
4public class LocalizedNameAttribute : Attribute
5{
6 public string Name { get;set;}
7}
8
9/// <summary>
10/// 扩展枚举
11/// </summary>
12public static class EnumExtension
13{
14 public static void ToLocalized(this Enum e)
15 {
16 Type type = member.GetType();
17
18 foreach (FieldInfo field in type.GetFields())
19 {
20 if (!field.IsDefined(typeof(LocalizedNameAttribute), false))
21 continue;
22 LocalizedNameAttribute att = (LocalizedNameAttribute)Attribute.
23 GetCustomAttribute(field, typeof(LocalizedNameAttribute));
24 return att.Name;
25 }
26 return member.ToString();
27 }
28}
29
30/// <summary>
31/// 性别
32/// </summary>
33public enum Gender
34{
35 [LocalizedName(Name = "男")]
36 Male,
37 [LocalizedName(Name = "女")]
38 Famale,
39 [LocalizedName(Name = "东方不败")]
40 EastNotFail,
41}
我们就可以 Gender.Famle.ToLocalized() 直接获取本地化后的字符串。
3.强类型转换扩展
利用强类型转换,我们可以在代码中少写很多强制转换和类型检查代码。
我们经常写出这样又臭又长的代码:
1MyAttribute att = (MyAttribute)Attribute
2 .GetCustomAttribute(methodInfo, typeof(MyAttribute));
现在,我们可以这样:
1MyAttribute att = methodInfo.GetAttribute<MyAttribute>();
今天先到这里,下次有经验再分享。