• Linq学习总结(2)——扩展方法


    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

    我们来为String类型定义一个简单的扩展方法:

    public static class Extensions
    {
    public static void SayHello(this String name)
    {
    Console.WriteLine(
    "Hello {0}",name);
    }
    }

    之后,我们可以在main函数中这样使用扩展方法:

    static void Main(string[] args)
    {
    String s
    = "Wade";
    s.SayHello();
    }

    这样看起来就像是String类型中直接定义好的方法一样,而且还能被智能感知到:

    我们注意这个方法名前有个向下的箭头,表示这是一个扩展方法的意思。

    但是我们需要认识到这个扩展方法并非真的是String的实例方法,它只是一个静态方法而已,所以我们将上面代码中的s设置为null时调用SayHello()方法,不会报空引用的错误。

    注意事项

    • 扩展方法是静态类中的静态方法;
    • 扩展方法的第一个参数的类型之前必需使用this修饰符,this指代被扩展的类;
    • 扩展方法的优先级比常规方法要低,如果某个类拥有一个同名方法的话,那么调用的将是实例方法;
    • 扩展方法隐式使用ExtensionAttribute;
    • 扩展方法不仅可以“扩展”基本类型和自定义复合类型,还可以扩展接口和委托。
     
    interface IMyInterface
    {
    void MethodA();
    }

    static class Extensions
    {
    public static void MethodB(this IMyInterface myInterface)
    {
    Console.WriteLine(
    "this is Extension MethodB");
    }
    }


    class classA :IMyInterface
    {
    public void MethodA()
    {
    Console.WriteLine(
    "This is classA MethodA");
    }
    }

    class classB : IMyInterface
    {
    public void MethodA()
    {
    Console.WriteLine(
    "This is classB MethodA");
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    classA A
    = new classA();
    classB B
    = new classB();
    A.MethodA();
    A.MethodB();
    B.MethodA();
    B.MethodB();
    }
    /*Output:
    * This is classA MethodA
    * this is Extension MethodB
    * This is classB MethodA
    * this is Extension MethodB
    */
    }

    泛型扩展方法

    当扩展方法与泛型结合在一起时,就变得非常强大了。下面我们来看下例子:

    static class Extensions
    {
    //首先我们为实现了IList接口的集合泛型类型添加了一个扩展方法
    public static IList<TSource> MyFind<TSource>(this IList<TSource> list, Func<TSource, bool> fun)
    {
    List
    <TSource> resultList = new List<TSource>();
    foreach (TSource item in list)
    {
    if (fun(item))
    {
    resultList.Add(item);
    }
    }
    return resultList;
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    IList
    <int> numList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };

    //然后调用自己定义的扩展方法,是不是有点Linq方法的感觉
    IList<int> resultList = numList.MyFind(n => n % 2 == 0);

    foreach (var item in resultList)
    {
    Console.WriteLine(item);
    }
    /*Output
    * 2
    * 4
    * 6
    * 8
    */
    }
    }


    我们可以利用Reflector这样的工具,查看下System.Linq命名空间,就像我们看见的那样,Linq其实就是一大堆扩展方法(还有泛型的)组成。

    园内有人对扩展方法“扩展”了很多功能,有兴趣的人可以看看:(本人也做个MARK^_^)

    http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html

  • 相关阅读:
    JMeter结构体系及运行原理
    maven pom配置文件样本
    django踩坑
    spring踩坑
    蓝牙连上电脑没声音
    XML 解析 & 特殊字符报错
    IDEA下maven工程的classpath
    mysql踩坑
    工作日记-9 远程接口调用注意点
    工作日记-8 ajax缓存
  • 原文地址:https://www.cnblogs.com/heqichang/p/2083521.html
Copyright © 2020-2023  润新知