明确使用扩展方法

扩展方法也可以像普通的静态类方法一样使用。这种调用扩展方法的方式更加冗长,但在某些情况下是必要的。

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 修饰符,则最后一行将编译。