扩展方法
源于对扩展方法的了解是来自List<T>的Where、Order、GroupBy等方法的使用,智能感知提示这些方法都是扩展方法,于是MSDN上查阅后总结如下自定义扩展方法(将字符串转换为Int,代码拷贝)
namespace MyCommon
{
public static class EString
{
public static int ToInt(this string t)
{
int id;
int.TryParse(t, out id);//这里当转换失败时返回的id为0
return id;
}
}
}
微软规定,扩展方法:1、必须是静态类和静态方法(而且必须是public)
2、参数必须以this作为前缀
其实咋一看,扩展方法明显违法了封装性的原则,把方法设为public,让外界直接调用,这是很违法封装原则的,但是这里没有办法,如果改为private,外界实例无法访问,但是微软告诉我们,虽然是使用实例方法的语法来调用扩展方法,但是编译器生成的IL中间语言的时候会把代码转换成对静态方法的调用,理论上说并未真正违法封装性的原则,但是这种解释有点牵强。
我突然发现,该静态类的名称 EString似乎毫无用处,似乎可以随意改动,的确是这样,这里要的只是命名空间和方法名,而方法的第一个参数决定了该扩展方法是用于对何种类型的扩展,例如上面的例子this string t,第一个参数的类型是string,则是对string做的扩展方法
另外扩展方法的优先级总是比实例本身的方法的优先级低,即如果A类本身有fun1()方法,则另外扩展一个同名的fun1方法,则扩展的fun1,永远不会执行,因为在编译的时候编译器永远不会绑定到该扩展方法