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"));
类和结构被认为比接口更具体。
以上内容是否对您有帮助:
← C# 运算符重载
更多建议: