using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { public static class InvokeExt { //扩展方法进行装箱输出继承IEnumerable<T>的内容项 public static void ShowItems<T>(this IEnumerable<T> collection) { foreach (var item in collection) { Console.WriteLine(item); } } //Action<Object>的尖括号里有一个Object说明有一个输入参数 public static void InvokeAndCatch<TException>(this Action<Object> d, Object o) where TException:Exception { try { //在调用这个扩展方法的时候已在Main方法中为这个action委托赋值过了,而在Main方法中已经定义了这个委托的行为是o=>console.writeline(o.gettype());有一个输入参数,委托的行为是在控制台打印这个输入参数的类型 //下面的语句相当于o=>Console.WriteLine(null.GetType());引发了空引用异常 d(o); } catch (Exception) { ; } } } class Program { static void Main(string[] args) { //action委托定义了方法的行为(这里是告诉编译器这里的动作是传入一个参数,并在控制台上输出这个参数的类型) Action<Object> action = o => Console.WriteLine(o.GetType()); // 这是为action<object>委托定义的一个扩展方法,这里的传入参数是一个null action.InvokeAndCatch<NullReferenceException>(null); Action a = "Jeff".ShowItems; a(); Console.ReadKey(); } } }