C# 扩展方法

2018-01-22 17:09 更新

C# 扩展方法

扩展方法可以用新方法扩展现有类型改变原始类型的定义。

扩展方法是静态类的静态方法,其中this修饰符应用于第一个参数。

第一个参数的类型将是扩展的类型。

例如:


public static class StringExtension {
   public static bool IsCapitalized (this string s) {
      if (string.IsNullOrEmpty(s))
         return false;
      return char.IsUpper (s[0]);
   }
}

IsCapitalized扩展方法可以被调用,就像它是一个字符串上的实例方法,如下所示:


Console.WriteLine ("Javascript".IsCapitalized());

一个扩展方法调用被转换回一个普通的静态方法调用:


Console.WriteLine (StringExtension.IsCapitalized ("Javascript"));

接口也可以扩展:


public static T First<T> (this IEnumerable<T> sequence){
    foreach (T element in sequence)
        return element;
    throw new InvalidOperationException ("No elements!");
}
...
Console.WriteLine ("Javascript".First()); // J


扩展方法与实例方法

任何兼容的实例方法优先于扩展方法。

在以下示例中,Main的MyMethod方法将始终优先 - 即使在使用int类型的参数x调用时:


class Main {
   public void MyMethod (object x) { } 
}

static class Extensions {
   public static void MyMethod (this Main t, int x) { }
}

在这种情况下调用扩展方法的唯一方法是通过正常的静态语法:


Extensions.MyMethod(...)

扩展方法与扩展方法

如果两个扩展方法具有相同的签名,则扩展方法必须作为普通静态方法调用,以消除调用方法的歧义。

如果一个扩展方法具有更多特定的参数,则更具体的方法优先。

以下代码显示了如何使用它:


static class StringExtension {
    public static bool IsCapitalized (this string s) {...}
}
static class ObjectHelper {
    public static bool IsCapitalized (this object s) {...}
}

以下代码调用StringExtension的IsCapitalized方法:


bool test1 = "Javascript".IsCapitalized();

要调用ObjectHelper的IsCapitalized方法,我们必须明确指定:


bool test2 = (ObjectHelper.IsCapitalized ("Javascript"));

类和结构被认为比接口更具体。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号