内容载入中...
扩展方法(Extension Method)
可以为已有的类型添加新的方法定义和实现,比如int类型目前没有一个名叫xxxyyy()的方法,
那么通过使用扩展方法,我们可以为int类型添加一个xxxyyy()方法。
这个有点类似于用来扩展系统功能的某些设计模式。
下面我们用代码来说话:
这是我们以前的写法:
1
public static class Extensions
2

{
3
public static string CamelCase(string identifier)
4

{
5
string newString = "";
6
bool sawUnderscore = false;
7
8
foreach (char c in identifier)
9
{
10
if ((newString.Length == 0) && Char.IsLetter(c))
11
newString += Char.ToUpper(c);
12
else if (c == ‘_‘)
13
sawUnderscore = true;
14
else if (sawUnderscore)
15
{
16
newString += Char.ToUpper(c);
17
sawUnderscore = false;
18
}
19
else
20
newString += c;
21
}
22
23
return newString;
24
}
25
}
26
27
static void Main(string[] args)
28

{
29
string[] identifiers = new string[]
{
30
"do_something",
31
"find_all_objects",
32
"get_last_dict_entry"
33
};
34
35
foreach (string s in identifiers)
36
Console.WriteLine("{0} becomes: {1}", s, Extensions.CamelCase(s));
37
}
38
C# 3.0中我们可以这样写:
1
public static class Extensions
2

{
3
public static string CamelCase(this string identifier)
4

{
5
string newString = "";
6
bool sawUnderscore = false;
7
8
foreach (char c in identifier)
9
{
10
if ((newString.Length == 0) && Char.IsLetter(c))
11
newString += Char.ToUpper(c);
12
else if (c == ‘_‘)
13
sawUnderscore = true;
14
else if (sawUnderscore)
15
{
16
newString += Char.ToUpper(c);
17
sawUnderscore = false;
18
}
19
else
20
newString += c;
21
}
22
23
return newString;
24
}
25
}
26
27
static void Main(string[] args)
28

{
29
string[] identifiers = new string[]
{
30
"do_something",
31
"find_all_objects",
32
"get_last_dict_entry"
33
};
34
35
foreach (string s in identifiers)
36
Console.WriteLine("{0} becomes: {1}", s, Extensions.CamelCase(s));
37
} 主要是下面这两个语句的变化:
1
public static string CamelCase(this string identifier)
2
Console.WriteLine("{0} becomes: {1}", s, s.CamelCase());
变量s原本是一个string类型,并没有CamelCase()方法,但是我们在CamelCase()方法的参数列表最前面加上一个this关键字,
则string s就拥有了一个新的方法CamelCase,很简单也很直接 :)
下面我们看一看一个稍微复杂一点的应用:
1
public static class Extensions
2

{
3
public static List<T> Combine<T>(this List<T> a, List<T> b)
4

{
5
var newList = new List<T>(a);
6
newList.AddRange(b);
7
return newList;
8
}
9
}
10
11
static void Main(string[] args)
12

{
13
var odds = new List<int>();
14
odds.Add(1);
15
odds.Add(3);
16
odds.Add(5);
17
odds.Add(7);
18
19
var evens = new List<int>();
20
evens.Add(0);
21
evens.Add(2);
22
evens.Add(4);
23
evens.Add(6);
24
25
var both = odds.Combine(evens);
26
Console.WriteLine("Contents of ‘both‘ list:");
27
foreach (int i in both)
28
Console.WriteLine(i);
29
}
怎%