为项目中的工具函数提供另类的实现
在项目开发过程中,经常会写一些工具类。这些类里面,其实什么具体业务也没有做,只是为一些逻辑和算法提供了一些实现。比如一些格式化字符串的操作,获取连接字符串的操作等等。为了让这些方法通用,能够非常方便的被调用到。往往会设计一些静态类,使用静态方法来实现。这种实现非常好,但是却比较麻烦。比如你设计了一个静态类叫做CommonFunctions,里面有很多静态类,其中有一个方法叫做DoSameThing经常被调用,于是每次你在调用的时候就需要这样写:
CommonFunctions.DoSameThing()
每次都要带上CommonFunctions这样的前缀,显得不是很整洁,书写起来也很麻烦。于是,在最初的时候我就想到了Java的静态导入,在Java中这种实现往往都会在文件最上方写上:
import static packagename.CommonFunctions.DoSameThing;
这样就可以省掉CommonFunctions这样冗余的前缀了。但是悲剧的是C#没有类似的静态导入机制,为了实现同样的东西,经过一段时间的思索,搜集了一些资料之后,终于发现,原来在.net framework 3.0 之后多了一种叫做类扩展的机制.
于是为了实现类似静态导入的能力,需要这样写:
namespace myNamespace
{static class CommonFunctions{public static void DoSameThing(this Object obj){//do samething you want
}}}
然后在你需要使用到这个方法的地方使用这个命名空间就可以了。其中DoSameThing的参数列表中第一个参数为 this ClassName o, 意思是这个方法是要扩展ClassName这个类的,也就是说所有ClassName这个类的实例,以后就都有DoSameThing这个方法了,而在上例中,直接扩展了Object,因为在C#中所有的类都是直接或者间接继承自Object的,所有在使用该命名空间之后,所有的类就都有了该方法。调用的时候就只需要写:
DoSameThing();
就可以了。如果你设计的扩展方法有多个参数,直接将你的参数写到this ClassName obj 这个参数后面就可以了。例如,我有个方法的原型是这样的:
public String OpsStr(String s1, String 2);
为了把这个函数扩展到String类,使得以后所有的String对象都可以使用,于是就可以这样实现:
这是对String类的扩展,如果是为了设计工具函数的话,直接对Object类进行扩展是一个很不错的选择。namespace myNamepace
{static class StringFunc{public String OpsStr(this String s, String s1, String s2){//do samethin you want
}}}