妙用扩展方法

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>();

今天先到这里,下次有经验再分享。

View Comments