作为技术博客的第一篇技术文章,一开始有点虚伪地想:有点不太愿意被人认为写这么“基础”的文章,园子里牛人多嘛。
仿佛软件界象中了什么魔咒似的,自己看不懂代码就是别人牛,自己早知道方法就是别人菜...
好了,好象离题了,其实决心写这些文章最大的原因就是希望能帮到一些朋友在开发过程中解决一些实际问题。
所以不要紧,韩寒都有收集5000句最恶毒留言的勇气,更何况我这个无名小卒呢...
言归正传,某天,kakim看到一位实习同学在做一个页面,想把一些时间和小数特殊的格式转换,
大概看了下,CodeBehind文件 发现有大量(是大量)类似下面这样写法的代码:
this.hdCheckInDate.Value = DateTime.Parse(dt.Rows[0]["arrivalDate"].ToString()).ToString("yyyy-MM-dd");
this.liAveRate.Text = decimal.Parse(dt.Rows[0]["roomRate"].ToString()).ToString("#,###.00");
然后再查了一下所有GridView或者Repeater等绑定列表页面,同样发现有几个页面也类似
<%# Convert.ToDateTime(Eval("arrivalDate")).ToString("yyyy-MM-dd") %>
这样的重复转换, 由于项目中比较多类似的页面,而且项目时间比较紧,能不能简化一下他们的工作,
所以就想起了.NET的扩展方法,写了一个扩展类
{
public static class ExtensionString
{
/// <summary>
/// 判断字符串空值
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool IsNullOrEmpty( this String value)
{
if (value != null )
return (value.Length == 0 );
return true ;
}
/// <summary>
/// 转换时间及小数
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToExtensionString( this Object obj)
{
string s = string .Empty;
if (obj == null ) return s;
if (obj is DateTime)
s = Convert.ToDateTime(obj).ToString( " yyyy-MM-dd " );
else if (obj is Decimal)
s = Convert.ToDecimal(obj).ToString( " ###,##0.00 " );
else
s = obj.ToString();
return s;
}
}
}
当然, 这里 ToExtensionString()方法业务处理写得比简单,每个人都可以灵活处理,不过对于整个项目大部分重复的工作的编码来说,就可以减少了很多不必要的麻烦,
在网站项目中引入扩展类,然后实习生每次新建页面做列表绑定转换时就会发现多了ToExtensionString()扩展方法了...
所以,我们可以让上面的编码变成以下的 "简洁"
而页面,所有GridView或者Repeater的列表当中也可以直接这样写
<%# Eval("arrivalDate").ToExtensionString() %>
<%# Eval("roomRate").ToExtensionString() %>
当然,想象丰富的朋友还可以写很多的扩展,比如字符过滤等等,还可以用这种方式对大部分类型进行扩展喔~~
不过,有一点还是要提醒一下的,扩展方法还是有规则:
1.如果实例的方法跟扩展的方有相同的签名,那么实例的方法被调用
2.如果两个扩展方法具有相同的签名,那么其实一个方法必须作为正常的静态方法被调用
3.扩展方法所属的静态类必须在作用域内,否则,该方法不能被调用
发挥你的想象能力吧,或许你会写出更强大的代码来~~