C# 3.0 新特性----扩展方法
2010-04-08 11:52 jiejiep 阅读(446) 评论(0) 编辑 收藏 举报- 主要目的
掌握对一个已经编译的类的方法的扩展 - 特别注意
a. 扩展某个类时,新建的类要使用 public static 修饰,因为默认的类是 internal 访问修饰符
b. 这个类要有文件作用域,即不能作为嵌套类使用
c. 扩展方法要声明为静态的
d. 扩展方法的第一个参数类型即是要扩展的类,且该参数前要加 this 关键字
e. 扩展类的命名很重要,当NET Framework 类库更新时,若更新后的类库中,添加了与你先前自定义的静态扩展类相同的类名,则会隐藏掉自定义的静态扩展类
f. 为类型A添加扩展方法时,同时也会为类型A的派生类添加该扩展方法,故尽量不要在基类上添加扩展方法,以免造成方法冗余。 - 具体实现
如下代码实现添加一个扩展 object 类的方法,因为 .net 中所有的类都继承自 object 类,故调用时,随意选择了 int 类型
代码如下:
代码1 publicstaticclass ExtendObject
2 {
3 publicstaticvoid ShowTypeInfo(thisobject obj)
4 {
5 Console.WriteLine("my datatype is {0}", obj.GetType().Name);
6 }
7 }调用时的代码如下:
可以有两种调用方法:一是实例调用,二是扩展类名调用代码1 class Program
2 {
3 staticvoid Main(string[] args)
4 {
5 int a =192;
6 //使用类实例调用静态方法
7 a.ShowTypeInfo();
8
9 //使用静态类名调用静态方法
10 ExtendObject.ShowTypeInfo(a);
11 Console.Read();
12 }
13 } -
现在,我们来分析一下,当编译器碰到代码 a.ShowTypeInfo() 时都做了哪些事:
首先,它会去检查 System.Int32类中是否有ShowTypeInfo方法的定义,如果有,则调用,如果没有,编译器则会去寻找所有静态类,看是否哪个静态类中有静态方法的第一个参数是Int32类型或者它的基类,并且有 this 关键字修饰。有则调用,无则会报错。
-
特别需要注意的是,扩展类与被扩展的类是两个不同的类,故扩展类中的类方法访问被扩展类的成员时,只能访问声明为 public 修饰符的成员。
代码如下:
被扩展的类:Bird -
class Bird
{
private string _bType;
public string BType
{
get;
set;
}
}
扩展类 ExtendBird1 public static class ExtendBird
2 {
3 public static void SetBirdType(this Bird b, string birdType)
4 {
5 //公共属性,可以访问
6 b.BType = birdType;
7
8 //会出现编译错误
9 _bType = birdType;
10 }
11 }