有许多方法扩展类。如果有类的源代码,继承就是给对象添加给你的好方法。但如果没有源代码,该怎么办?此时可以使用扩展方法,扩展方法是静态方法,是类的一部分,但实际上没有放在类的源代码中。
定义和调用扩展方法步骤:
1、定义一个静态类以包含扩展方法。该类必须对客户端代码可见。有关可访问性规则的更多信息,请参见访问修饰符。
2、将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。
3、该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。
4、在调用代码中,添加一条 using 指令以指定包含扩展方法类的命名空间。
5、按照与调用类型上的实例方法一样的方式调用扩展方法。
请注意,第一个参数不是由调用代码指定的,因为它表示正应用运算符的类型,并且编译器已经知道对象的类型。您只需通过 n 为这两个形参提供实参。
下面的示例在 MyExtensions.StringExtension 类中实现了一个名为 WordCount 的扩展方法。该方法对 String类进行操作,而该类被指定为第一个方法参数。MyExtensions 命名空间被导入到应用程序命名空间中,并且该方法是在 Main 方法内调用的。
using System.Linq;
using System.Text;
using System;
namespace CustomExtensions
{
//Extension methods must be defined in astatic class
public static class StringExtension
{
// This is theextension method.
// The firstparameter takes the "this" modifier
// and specifies thetype for which the method is defined.
public static int WordCount(thisString str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
namespace Extension_Methods_Simple
{
//Import the extension method namespace.
using CustomExtensions;
class Program
{
static void Main(string[] args)
{
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that thefirst
// parameter is not specified by the callingcode.
int i = s.WordCount();
System.Console.WriteLine("Wordcount of s is {0}", i);
}
}
}