妙用扩展方法

1.参数检查

对于写库的大多数人来说,参数检查是一件极其麻烦的事情,我们需要重复写以下代码:

1
2
3
4
public void Foo(string name)
{
  if(name == null) throw new ArgumentNullException("name");
}

现在我们有了扩展方法,则可以这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// 参数检查扩展方法类
/// </summary>
public static class RequireExtension
{
  public static void RequireNotNull(this object obj, string name)
  {
    if(name == null) throw new ArgumentNullException("name");
    if(obj is null) throw new ArgumentNullException(name);
  }
}

// 示例
public void Foo(string name)
{
  name.RequireNotNull("name");
}

2.本地化

当我们使用枚举,经常需要在枚举和本地化字符串之间转换,或者编码规范为英文,需要将枚举转换为中文,扩展方法可以让我们这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/// <summary>
/// 本地化后的友好名称
/// </summary>
public class LocalizedNameAttribute : Attribute
{
  public string Name { get;set;}
}

/// <summary>
/// 扩展枚举
/// </summary>
public static class EnumExtension
{
  public static void ToLocalized(this Enum e)
  {
    Type type = member.GetType();

    foreach (FieldInfo field in type.GetFields())
    {
      if (!field.IsDefined(typeof(LocalizedNameAttribute), false))
        continue;
      LocalizedNameAttribute att = (LocalizedNameAttribute)Attribute.
      GetCustomAttribute(field, typeof(LocalizedNameAttribute));
      return att.Name;
    }
    return member.ToString();
  }
}

/// <summary>
/// 性别
/// </summary>
public enum Gender
{
  [LocalizedName(Name = "男")]
  Male,
  [LocalizedName(Name = "女")]
  Famale,
  [LocalizedName(Name = "东方不败")]
  EastNotFail,
}

我们就可以 Gender.Famle.ToLocalized() 直接获取本地化后的字符串。

3.强类型转换扩展

利用强类型转换,我们可以在代码中少写很多强制转换和类型检查代码。
我们经常写出这样又臭又长的代码:

1
2
MyAttribute att = (MyAttribute)Attribute
  .GetCustomAttribute(methodInfo, typeof(MyAttribute));

现在,我们可以这样:

MyAttribute att = methodInfo.GetAttribute<MyAttribute>();

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

Zealic @ 2008-03-15

View Comments |
Categories: tech.dotnet
Tags:

Related posts