一、扩展方法
定义:
1、扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
2、扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
3、扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
4、扩展方法的三个要素是:静态类、静态方法以及this关键字。
系统集合扩展方法:
1、Person类(实体类)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UI2
{
public class Person
{
public Guid Pid { get; set; }
public string Pname { get; set; }
public int Page { get; set; }
public char Psex { get; set; }
public Person()
{
}
public Person(Guid pid, string pname, int page, char psex)
{
Pid = pid;
Pname = pname;
Page = page;
Psex = psex;
}
}
}
2、Method类(自定义扩展方法的类)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace UI2
{
public static class Method
{
/// <summary>
/// 1.判断是否为空或者为NULL
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsNullOrEmpty(this string str)
{
return string.IsNullOrEmpty(str);
}
/// <summary>
/// 2.正则表达式的扩展方法
/// </summary>
/// <param name="str"></param>
/// <param name="pattern"></param>
/// <returns></returns>
public static bool IsMatch(this string str,string pattern)
{
if (string.IsNullOrEmpty(str))
{
return false;
}
return Regex.IsMatch(str,pattern);
}
/// <summary>
/// 3.判断是否为Int
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsInt(this string str)
{
int i;
return int.TryParse(str,out i);
}
/// <summary>
/// 字符串转Int
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static int ToInt(this string str)
{
return int.Parse(str);
}
}
}
Program类 (Main方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UI2
{
class Program
{
public delegate void DelegateTest(string name);
static void Main(string[] args)
{
**1、集合的扩展方法-Select**
//例子1:
List<int> ints = new List<int>()
{
1,2,3,4,5,6,7,8
};
var ins = ints.Select(delegate (int i)
{
return i > 5;
});
foreach (var i in ins)
{
Console.WriteLine(i);
}
//例子2:对象
List<Person> persons = new List<Person>()
{
new Person(Guid.NewGuid(),"zs",18,'男'),
new Person(Guid.NewGuid(),"ls",19,'女'),
new Person(Guid.NewGuid(),"ww",20,'男')
};
var ps = persons.Select(delegate (Person p)
{
return p.Page > 19;
});
foreach (var p in ps)
{
Console.WriteLine(p);
}
**2、集合的扩展方法-Where**
//例子1:
List<int> ints = new List<int>()
{
1,2,3,4,5,6,7,8
};
IEnumerable<int> ins = ints.Where(delegate (int i)
{
return i > 3;
});
foreach (var i in ins)
{
Console.WriteLine(i);
}
//例子2:
List<Person> persons = new List<Person>()
//{
// new Person(Guid.NewGuid(),"zs",18,'男'),
// new Person(Guid.NewGuid(),"ls",19,'女'),
// new Person(Guid.NewGuid(),"ww",20,'男')
//};
//var lpp = persons.Where(delegate (Person p)
//{
// return p.Page > 18;
//});
//foreach (var p in lpp)
//{
// Console.WriteLine(p.Pname);
//}
**3、集合的扩展方法-Count**
//例子1:
List<int> ints = new List<int>() {
1,2,3,4,5,6,7,8
};
int j = ints.Count(delegate (int i)
{
return i > 5;
});
Console.WriteLine(j);
**4、集合的扩展方法-ForEach**
List<int> ints = new List<int>() {
1,2,3,4,5,6,7,8
};
ints.ForEach(delegate (int i)
{
if (i > 5)
{
Console.WriteLine(i);
}
else
{
Console.WriteLine("数字不大于5!!!");
}
});
//自定义 扩展方法
//Console.WriteLine(Method.IsNullOrEmpty(null));
//判断当前的字符是否是一个完整的数字
//string str = "123";
//string pattern = @"^[1-9]\d+$";
//邮箱
//string str = "[email protected]";
//string pattern = @"^\w+\@\w+(.com|cn|.org|.xyz|.net)$";
//手机号码
//string str = "18570665187";
//string pattern = @"^1[3-9]\d{9}$";
//区号-电话号码-分机号
//string str = "0731-88888888-1234";
//string pattern = @"^0[3-8]\d{1,2}-[1-9]{7,8}-\d{3,4}$";
//Console.WriteLine(Method.IsMatch(str,pattern));
//判断是否是Int类型
//Console.WriteLine(Method.IsInt("1"));
//string转int
Console.WriteLine(Method.ToInt("1"));
Console.ReadKey();
}
}
}
二、正则表达式
三、总结
1.定义扩展方法:
(1).必须在静态类中
(2).必须有一个参数
(3).参数必须已this打头
(4).第一个参数不能够有修饰符(out/ref)
2.把扩展方法定义到其它程序集中时,一定要注意调用扩展方法的环境中需要包含扩展方法所在的命名空间
3.建议只在不得已的情况下才实现扩展方法,并谨慎地实现