重构到扩展方法(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;
            }
        }
    }

 

posted @ 2010-01-24 11:05  primeli  阅读(454)  评论(0编辑  收藏  举报