文章出處
文章列表
不論是JavaScript還是C#程序,我們已經習慣了采用如下所示的“鏈式調用”的方式進行編程,這樣確實會使我們的程序變得很精練。
1: new Foo()
2: .UseXxx()
3: .UseZzz()
4: .UseZzz()
5: .Invoke();
采用這種鏈式調用方式的很多方法都是擴展方法,比如上面所示的UseXxx、UseYyy和UseXxx方法就是采用如下形式定義的擴展方法。
1: public interface IFoo
2: {
3: void Invoke();
4: }
5:
6: public class Foo : IFoo
7: {
8: public void Invoke()
9: {}
10: public void Execute()
11: {}
12: }
13:
14: public static class FooExtensions
15: {
16: public static IFoo UseXxx(this IFoo foo)
17: {
18: return foo;
19: }
20: public static IFoo UseYyy(this IFoo foo)
21: {
22: return foo;
23: }
24: public static IFoo UseZzz(this IFoo foo)
25: {
26: return foo;
27: }
28: }
到目前為止,一切都顯得很完美,而且我看到絕大部分的擴展方法也是采用這種方式定義的。但是如果我們希望采用如下的方式調用Foo的Execute方法的,很明顯下面這樣的代碼是不能通過編譯的。
1: new Foo()
2: .UseXxx()
3: .UseZzz()
4: .UseZzz()
5: .Execute();
我們不得不將這段代碼改寫成如下的形式。改寫的代碼顯得很丑陋,和上面這段代碼相比較:第一、多聲明了一個變量;第二、將一段很“流暢”的代碼活生生拆分成兩段;第三、在調用Execute方法是添加了一個很“生硬”的類型轉換。
1: IFoo foo = new Foo()
2: .UseXxx()
3: .UseYyy()
4: .UseZzz();
5:
6: ((Foo)foo).Execute();
如果希望上面這段代碼合法有效,我們的三個擴展方法應該定一個成如下的形式。
1: public static class FooExtensions
2: {
3: public static T UseXxx<T>(this T foo) where T: IFoo
4: {
5: return foo;
6: }
7: public static T UseYyy<T>(this T foo) where T : IFoo
8: {
9: return foo;
10: }
11: public static T UseZzz<T>(this T foo) where T : IFoo
12: {
13: return foo;
14: }
15: }
文章列表
全站熱搜