明確使用擴充套件方法

擴充套件方法也可以像普通的靜態類方法一樣使用。這種呼叫擴充套件方法的方式更加冗長,但在某些情況下是必要的。

static class StringExtensions
{
    public static string Shorten(this string text, int length) 
    {
        return text.Substring(0, length);
    }
}

用法:

var newString = StringExtensions.Shorten("Hello World", 5);

何時將擴充套件方法作為靜態方法呼叫

在某些情況下,你仍需要使用擴充套件方法作為靜態方法:

  • 解決與成員方法的衝突。如果新版本的庫引入具有相同簽名的新成員方法,則會發生這種情況。在這種情況下,編譯器將首選成員方法。
  • 使用相同簽名解決與另一種擴充套件方法的衝突。如果兩個庫包含類似的擴充套件方法,並且在同一檔案中使用具有擴充套件方法的兩個類的名稱空間,則會發生這種情況。
  • 將擴充套件方法作為方法組傳遞給委託引數。
  • 通過 Reflection 做自己的繫結。
  • 在 Visual Studio 的立即視窗中使用擴充套件方法。

使用靜態

如果使用 using static 指令將靜態類的靜態成員引入全域性範圍,則會跳過擴充套件方法。例:

using static OurNamespace.StringExtensions; // refers to class in previous example

// OK: extension method syntax still works.
"Hello World".Shorten(5);
// OK: static method syntax still works.
OurNamespace.StringExtensions.Shorten("Hello World", 5);
// Compile time error: extension methods can't be called as static without specifying class.
Shorten("Hello World", 5);

如果從 Shorten 方法的第一個引數中刪除 this 修飾符,則最後一行將編譯。