通俗的讲,扩展方法就是可以对String,Int,DateTime,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。
示例一:对时间类型变量进行格式化显示
常规写法:
DateTime now = DateTime.Now;
string time = now.ToString("yyyy-mm-dd hh:mm:ss");
扩展方法:
定义一个扩展方法
using System;
namespace DB.MySql
{
public static class ExtHelper
{
/// <summary>
/// 日期格式化
/// </summary>
public static string DateToString(this DateTime dt)
{
return dt.ToString("yyyy-mm-dd hh:mm:ss");
}
}
}
上面代码表示为DateTime类型定义一个扩展方法,方法名称为DateToString。
当在项目中要对时间类型的变量进行格式化时,输入"now."便可以看见自动提示有个DateToString()方法,就可以直接像日期类型本身具有的实例方法一样调用,这样是非常方便的。
示例二:字符串转为数字
常规写法:
/// <summary>
/// 字符串转数字
/// </summary>
public static int StrToInt(string s)
{
int id;
int.TryParse(s, out id);//这里当转换失败时返回的id为0
return id;
}
调用:
string s = "2";
int i = StrToInt(s);
扩展方法:
/// <summary>
/// 将字符串转换为Int
/// </summary>
/// <param name="t"></param>
/// <returns>当转换失败时返回0</returns>
public static int StrToInt(this string t)
{
int id;
int.TryParse(t, out id);//这里当转换失败时返回的id为0
return id;
}
调用:
string s = "2";
int i = s.StrToInt();
示例三:判断一个日期是否在两个日期的范围内(带参数的扩展方法)
扩展方法:
/// <summary>
/// 此时间是否在此范围内
/// </summary>
/// <param name="t"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public static bool IsRange(this DateTime t, DateTime startTime, DateTime endTime)
{
if ((startTime - t).TotalSeconds > 0)
{
return false;
}
if ((endTime - t).TotalSeconds < 0)
{
return false;
}
return true;
}
调用:判断t1是否在dtStart和dtEnd时间范围内
DateTime t1 = DateTime.Now;
DateTime dtStart = DateTime.Now.AddDays(-1);
DateTime dtEnd = DateTime.Now.AddDays(1);
bool b = t1.IsRange(dtStart,dtEnd);
由上面三个简单的示例就可以看出扩展方法在实际的开发中是非常实用的,下面对扩展方法做一个总结:
扩展方法的要素:
1.此方法必须是一个静态方法(方法使用static修饰)
2.此方法必须放在静态类中(class使用static修饰)
3.此方法的第一个参数必须以this开头,并且指定此方法是扩展自哪个类型(DateTime、string等等)
扩展方法的特点:
1.扩展方法扩展自哪个类型,就必须是此类型的变量来使用,其他类型无法使用,实例一种扩展自DateTime类型,就只能是被DateTime类型的变量.出来()
2.扩展方法中的this后面的参数不属于方法的参数,示例一和示例二都是无参数的扩展方法,示例一种this后面的DateTime dt是指明扩展方法扩展自日期类型。实例三为有参扩展方法,startTime和endTime为两个实参
3.如果扩展方法和实例方法具有相同的签名,则优先调用实例方法
4.扩展自父类上的方法,可以被子类的对象直接使用
5.扩展自接口上的方法,可以被实现类的对象直接使用
6.扩展方法最终还是被编译器编译成:静态类.静态方法(),本例中now.DateToString() 最终还是会被编译成DateHelper.DateToString(now),这是它的本质