续上面

来源:互联网 发布:windows的uac 编辑:程序博客网 时间:2024/05/01 13:04

4.扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型或修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。例如,我们可以让Random类的所有实例对象拥有一个返回随机bool值的方法。我们不能对Random类本身进行修改,但可以对它进行扩展,如下代码所示:

staticclass Program {///<summary>/// 随机返回 true 或 false///</summary>///<param name="random">this参数自动指定到Random的实例</param>///<returns></returns>publicstaticbool NextBool(this Random random) {return random.NextDouble() >0.5;    }staticvoid Main(string[] args) {//调用扩展方法        Random rd = new Random();bool bl = rd.NextBool();        Console.WriteLine(bl.ToString());        Console.ReadKey();    }}

注意,扩展方法必须在非泛型的静态类中定义,上面的Program类如不加static修饰符则会报错。
我们可以创建一个接口的扩展方法,这样实现该接口的类都可以调用该扩展方法。看下面一个完整示例:

///<summary>/// 购物车类 (实现 IEnumerable<Product> 接口)///</summary>publicclass ShoppingCart : IEnumerable<Product> {public List<Product> Products { get; set; }public IEnumerator<Product> GetEnumerator() {return Products.GetEnumerator();    }    IEnumerator IEnumerable.GetEnumerator() {return GetEnumerator();    }}///<summary>/// 定义一个静态类,用于实现扩展方法(注意:扩展方法必须定义在静态类中)///</summary>publicstaticclass MyExtensionMethods {///<summary>/// 计算商品总价钱///</summary>publicstaticdecimal TotalPrices(this IEnumerable<Product> productEnum) {decimal total = 0;foreach (Product prod in productEnum) {            total += prod.Price;        }return total;    }}class Program {staticvoid Main(string[] args) {// 创建并初始化ShoppingCart实例,注入IEnumerable<Product>        IEnumerable<Product> products = new ShoppingCart {            Products = new List<Product> { new Product {Name = "Kayak", Price = 275}, new Product {Name = "Lifejacket", Price = 48.95M}, new Product {Name = "Soccer ball", Price = 19.50M}, new Product {Name = "Corner flag", Price = 34.95M}            }        };// 创建并初始化一个普通的Product数组        Product[] productArray = { new Product {Name = "Kayak", Price = 275M}, new Product {Name = "Lifejacket", Price = 48.95M}, new Product {Name = "Soccer ball", Price = 19.50M}, new Product {Name = "Corner flag", Price = 34.95M}         };// 取得商品总价钱:用接口的方式调用TotalPrices扩展方法。decimal cartTotal = products.TotalPrices();// 取得商品总价钱:用普通数组的方式调用TotalPrices扩展方法。decimal arrayTotal = productArray.TotalPrices();        Console.WriteLine("Cart Total: {0:c}", cartTotal);        Console.WriteLine("Array Total: {0:c}", arrayTotal);        Console.ReadKey();    }}

5.Lambda 表达式
Lambda 表达式和匿名函数其实是一件事情。不同是,他们语法表现形式不同,Lambda 表达式在语法上实际上就是匿名函数的简写。直接介绍匿名函数和Lambda表达式的用法没什么意思,在这里,我要根据实际应用来讲一个两者用法的例子,这样在介绍知识点的同时也能和大家分享一下解决问题的思想。
假如我们要实现一个功能强大的商品查询方法,这个商品查询方法如何查询商品是可以由用户自己来决定的,用户可以根据价格来查询商品,也可以根据分类来查询商品等等,也就是说用户可以把自己的查询逻辑传递给这个查询方法。要编写这样一个方法,我们很自然的会想到用一个委托来作为这个方法的参数,这个委托就是用户处理商品查询的逻辑。 我们不防把这个查询方法称为“商品查询器”。我们可以用静态的扩展方法来实现这个“商品查询器“,这样每个商品集合对象(如 IEnumerable products)可以直接调用该静态方法返回查询结果。解决问题的思想有了,接下来就是实现了。或许你对这一段描述有点蒙,结合代码可能让你更清晰。下面是这个“商品查询器”-Filter方法的实现代码: