2015年9月11日 星期五

[C#] Extension 方法,延伸原有物件的方法

.net中有一個我覺得不錯的東西就是Extension

他可以用來延伸原本的物件,加入一個自定的方法

使用上就跟原本物件一樣用 『 . 』接下去就好

舉個例子

我想要再原本的string上多一個方法叫做sayHello()

以往的作法可能向這樣
public void main()
{
    string name = "Ina";
    string sayHi = sayHello(name);
}

public string sayHello(string name)
{
    return string.format("Hello, I'm {0}",name);
}

使用Extension 延伸原本的string物件方法
public void main()
{
    string name = "Ina";
    string sayHi = name.sayHello();
}

原生的string並沒有sayHello(),使用Extension,不需要繼承或建立新的物件

就能使string多一個sayHello()方法

好吧,我不得不承認這個範例是有點蠢

但我還是想使用這個範例說明建構步驟

首先第一步,先建立一個static  class




namespace myproject.util{
    public static class StringExtension()
    {

    }
}

2. 然後再裡面新增一個靜態方法 sayHello
namespace myproject.util{
    public static class StringExtension()
    {
         public static string sayHello(this string name)
         {
             return string.format("Hello, I'm {0}",name);
         }
    }
}

然後記得要用的時候要 using myproject.util 不然會找不到

這樣就大功告成了

必須要注意的地方是

靜態方法中的第一個參數一定要this string,代表我現在在用的string物件

如果有其他參數要帶入的話,直接在後面加上即可,例如
public static string sayHello(this string name, int age)
{
        return string.format("Hello, I'm {0}. I'm {1} years old",name, age.ToString());
}

老實說,從這個範例實在看不出他的好處

甚至覺得有點蠢蠢的,但是要定義一個通用的方法

不需要使用繼承就可以全系統使用,真的是蠻方便的

而且Extension可以散落各地

雖然都是string的延伸,但是可以根據使用情況不同

寫在不同的cs檔案中

避免共同編輯同一份文件造成衝突

也比較好管理


沒有留言:

張貼留言