扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型,而且不需要修改原本的类的程序代码。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,
并且该参数以 this 修饰符为前缀。
要实现扩展方法十分简单,首先决定要为哪个类实现扩展方法,接着建立一个静态类(static class),名称建议使用“要扩展的类名称”+Extension 字样,例如像扩展Int 方法,就将类命名为Int32Extension;要扩展DateTime,就命名为DateTimeExtension。接下来在类内加入要扩展的方法,但要注意两件事:
(1)必须是静态方法,且名称不可以和现有的方法冲突。
(2)至少要有一个扩展类型输入参数,扩展类型输入参数格式必须是“this[要扩展的类名称][参数名称]”,若有两个以上的参数,则扩展 类型输入参数必须放在第一个,且不能设置默认值。
下面是一个例子,想要扩展int 和double 两个对象,分为赋予产生货币字符串与百分比字符串的功能,按照扩展方法的规则,先定义Int32Extension 与DoubleExtension 两个类,并声明为static class
public static class Int32Extension
{
public static string FormatForMoney(this int Value)
{
return Value.ToString("$###,###,###,##0");
}
}
public static class DoubleExtension
{
public static string FormatPercent(this doubel Value)
{
return Value.ToString("0.00%");
}
}
using System;
using static System.Console;
namespace ExtensionTest
{
class Program
{
static void Main(string[] args)
{
int money = 12456789;
double p = 0.123456;
WriteLine("{0}",money.FormatForMoney());
WriteLine("{0}", p.FormatPercent());
}
}
}
1.如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。
2.针对已实现的类库,不应为了避免程序集的版本号递增而使用扩展方法。一般没有源代码,如果想对现有类进行扩展,可用扩展方法。
如果要向你拥有源代码的库中添加重要功能,应遵循适用于程序集版本控制的标准 .NET Framework 准则。
3.若要使用不同命名空间内的扩展方法,记得要加上命名空间声明(使用using),否则编译器会找不到扩展方法的类。