1.参数检查
对于写库的大多数人来说,参数检查是一件极其麻烦的事情,我们需要重复写以下代码:
public void Foo(string name) { if(name == null) throw new ArgumentNullException("name"); } |
现在我们有了扩展方法,则可以这样:
/// <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.本地化
当我们使用枚举,经常需要在枚举和本地化字符串之间转换,或者编码规范为英文,需要将枚举转换为中文,扩展方法可以让我们这样。
/// <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.强类型转换扩展
利用强类型转换,我们可以在代码中少写很多强制转换和类型检查代码:
我们经常写出这样又臭又长的代码:
MyAttribute att = (MyAttribute)Attribute.GetCustomAttribute(methodInfo, typeof(MyAttribute)); |
现在,我们可以这样:
MyAttribute att = methodInfo.GetAttribute<MyAttribute>(); |
今天先到这里,下次有经验再分享。