重构到扩展方法(3):支持链式写法,让我们疯狂的点点点
什么是链式写法?
就是Linq那样的,不停的点点点。比如collection.Where(o=>o.id==0).FirstOrDefault();
如何实现链式写法?
关键就是要Return!
1. 链式写法,String.IsNullOrEmpty(),写起来很顺,"".IsNullOrEmpty()而不是String.IsNullOrEmpty("")
public static bool IsNullOrEmpty(this string str) { return String.IsNullOrEmpty(str); }
2. 链式写法,判断是否为空
public static bool IsNull(this object obj) { return obj == null; }
3. 链式写法,替换as运算符
public static T As<T>(this object obj) { if (obj.IsNull()) throw new ArgumentNullException("obj"); return obj is T ? (T)obj : default(T); }
4. 链式写法,对象不停的做事。
public static T Action<T>(this T target, Action<T> action) { action(target); return target; }
5. 得到类型的默认值,等同于default(T),可得到的是Type对象咋办?用这个扩展方法。
public static class TypeExtension { public static object GetDefaultValue(this Type type) { var typeCode = Type.GetTypeCode(type); return GetDefualtValue(typeCode); } public static object GetDefualtValue(TypeCode typeCode) { switch (typeCode) { case TypeCode.Boolean: return default(Boolean); case TypeCode.Byte: return default(Byte); case TypeCode.Char: return default(Char); case TypeCode.DateTime: return default(DateTime); case TypeCode.DBNull: return default(DBNull); case TypeCode.Decimal: return default(Decimal); case TypeCode.Double: return default(Double); case TypeCode.Empty: return null; case TypeCode.Int16: return default(Int16); case TypeCode.Int32: return default(Int32); case TypeCode.Int64: return default(Int64); case TypeCode.Object: return default(Object); case TypeCode.SByte: return default(SByte); case TypeCode.Single: return default(Single); case TypeCode.String: return default(String); case TypeCode.UInt16: return default(UInt16); case TypeCode.UInt32: return default(UInt32); case TypeCode.UInt64: return default(UInt64); default: return null; } } }