“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。
`
1.此方法必须是一个静态方法
2.此方法必须放在静态类中
3.此方法的第一个参数必须以this开头,并且指定此方法是扩展自哪个类型
代码如下(示例):
class Student
{
public string Name { get; set; }//名字
public int Age { get; set; } //年龄
}
代码如下(示例):
class StudentList
{
//私有学生列表
List<Student> mStudentList = new List<Student>();
//学生个数
public int StudentsCount
{
get
{
return mStudentList.Count;
}
}
//添加学生
public void AddStudent(string name, int age)
{
mStudentList.Add(new Student() { Name = name, Age = age });
}
}
代码如下(示例):
static class StudentListEx
{
//相当于传入一个实例studentList,并不能调用私有变量
//public static int SumOfStudentsAge(this StudentList studentList)
//{
// foreach (var item in studentList.mStudentList)//调用不到
// {
// }
//}
//打印学生个数
public static void WriteLineStudentsCount(this StudentList studentList)
{
Console.WriteLine("学生个数:" + studentList.StudentsCount);
}
//与原有函数相同(调用原函数)
public static void AddStudent(this StudentList studentList, string name, int age)
{
Console.WriteLine("调用扩展方法");
}
//参数不同
public static void AddStudent(this StudentList studentList, Student student)
{
Console.WriteLine("调用扩展方法2");
studentList.AddStudent(student.Name, student.Age);
}
}
代码如下(示例):
class Program
{
static void Main(string[] args)
{
//创建列表类
StudentList studentList = new StudentList();
//添加学生
studentList.AddStudent("小明", 10);
//拓展方法添加学生
studentList.AddStudent(new Student() { Name = "小胡椒", Age = 11 });
//打印学生数量
studentList.WriteLineStudentsCount();
Console.ReadKey();
}
}
1.扩展方法只能调用类共有的内容(属性,字段,方法);
2.与原类同名同参数的扩展方法不生效;
1.扩展方法扩展自哪个类型,就必须是此类型的变量来使用,其他类型无法使用,本例扩展自StudentList 类型,就只能是被StudentList 类型的变量.出来(studentList.AddStudent(new Student() { Name = “小胡椒”, Age = 11 })
2.this后面的DateTime dt是指明扩展方法扩展自何种类型
3.如果扩展方法和实例方法具有相同的签名,则优先调用实例方法
4.扩展自父类上的方法,可以被子类的对象直接使用
5.扩展自接口上的方法,可以被实现类的对象直接使用
6.扩展方法最终还是被编译器编译成:静态类.静态方法(),本例中studentList.WriteLineStudentsCount();最终还是会被编译成StudentListEx.WriteLineStudentsCount(studentList);,这是它的本质