c#之扩展方法

扩展方法就是能向现有的类型添加方法,而不需创建新的派生类型,或者其他方式修改原始类型,扩展方法是一种特殊的静态类型,但可以像扩展类型上的实例方法一样进行调用,现在我们来实现一个简单的例子

扩展方法的三个要素是:静态类静态方法以及this关键字

为什么扩展方法必须定义成静态类:静态方法是不属于某个类的实例的,也就是说我们不需要实例化这个类,就可以访问这个静态方法

扩展方法必须在非泛型的静态类中定义。

新建一个控制台程序,给封装好的String类型添加一个自定义的NextString方法,用来输出字符串+“hehe”的形式

 

static class myTest
    {
        public static string NextString(this string rand)
        {
            return rand.ToString() + "hehe";
        }
    }
string s ="aaaa";
            Console.WriteLine(s.NextString());
            Console.ReadLine();

image

注意:如果扩展原先相同类的中的方法,这就编译器在用方法的时候还是会使用原先定义的方法

public static string ToLower(this string test)
        {
            return test + "ToLower";
        }
string s ="aaaa";
            Console.WriteLine(s.NextString());
            Console.WriteLine(s.ToLower());
            Console.ReadLine();

image

 

 

 

可见定义和原类中相同方法名字的扩展方法,编译器还是使用原来的方法

注意:如果后期的CLR版本中在String类中自己增加了NextString()方法的话,那我扩展的NextString()方法就会被遗忘

 

学习System.Linq.Enumerable类中的扩展方法

1.使用where

List<Person> maleList = personList.Where(p =>
                p.Gender == true).ToList();
            maleList.ForEach(m => Console.WriteLine(m.ToString()));

扩展方法的本质是在运行时调用扩展类的静态方法,而我们写的Lambda表达式在编译时又会被转为匿名方法(准确地说应该是预定义泛型委托实例)作为方法参数传入扩展方法中,最后调用执行该扩展方法生成一个新的List集合返回。

2.select

3.OrderBy方法

4.Join

在数据库中,我们对两个表或多个表进行连接查询时往往会用到join语句,然后指定两个表之间的关联关系(例如: a.bid = b.aid)在标准查询运算符中,细心的.NET基类库也为我们提供了Join方法。现在,假设我们有两个类:Person和Children,其中每个Children对象都有一个ParentID,对应Person对象的ID,现需要打印出所有Person和Children的信息,可以借助Join方法来实现。

static void SQOJoinDemo()
        {
            List<Person> personList = GetPersonList();
            List<Children> childrenList = GetChildrenList();

            // 连接查询
            var joinedList = personList.Join(childrenList,
                p => p.ID, c => c.ParentID, (p, c) => new
                {
                    ParentID = p.ID,
                    ChildID = c.ChildID,
                    ParentName = p.Name,
                    ChildName = c.ChildName
                }).ToList();
            joinedList.ForEach(c => Console.WriteLine(c.ToString()));
        }

4.GroupBy

5.Skip与Take方法

 

总结

(1)如何定义扩展方法:

定义静态类,并添加public的静态方法,第一个参数 代表 扩展方法的扩展类。

a) 它必须放在一个非嵌套、非泛型的静态类中(的静态方法);

b) 它至少有一个参数;

c) 第一个参数必须附加 this 关键字;

d) 第一个参数不能有任何其他修饰符(out/ref)

e) 第一个参数不能是指针类型

(2)当我们把扩展方法定义到其它程序集中时,一定要注意调用扩展方法的环境中需要包含扩展方法所在的命名空间

(3)如果要扩展的类中本来就有和扩展方法的名称一样的方法,到底会调用成员方法还是扩展方法呢?

posted @ 2014-12-02 14:58  草旅虫  阅读(713)  评论(0)    收藏  举报