详细解释c# 扩展方法的理解
理解扩展方法
扩展方法的概念对于使用过JavaScript(考虑prototype)的人来说,也应该是非常熟悉的。
使用扩展方法,你可以向一个已有类中添加新的方法。例如,你可以创建任意一个方法,并将它添加到String类中。
由于害怕JavaScript注入攻击,我一直以来都对字符串进行HTML编码。在.NET Framework 2.0中,可以调用静态方法Server.HtmlEncode()来对字符串进行HTML编码,如下,
string evilString = “<script>alert(‘boom!’)<” + “/script>”;
ltlMessage.Text = Server.HtmlEncode(evilString);
在这段代码中,调用了Server类中的静态方法HtmlEncode()。如果我们可以向下面这样,直接调用字符串的HtmlEncode()方法,岂不妙哉
string evilString = “<script>alert(‘boom!’)<” + “/script>”;
ltlMessage.Text = evilString.HtmlEncode();
使用扩展方法,就可以这么做。我们可以向喜欢的类中添加任何方法。创建扩展方法,首先要创建一个静态类,并创建一个第一个参数为特殊参数的静态方法。代码清单18-9向String类中添加HtmlEncode()方法,以此描述了如何创建扩展方法。
代码清单 18-9 LanguageChanges\MyExtensions.vb[2]
MyExtensions { HtmlEncode(this string str) { return System.Web.HttpUtility.HtmlEncode(str); } }注意,HtmlEncode()方法中仅有的参数前面多了关键字this。这样的参数指明了扩展方法所应用的类型。
在VB.NET中创建扩展方法与在C#中极为类似。代码清单18-10中的HtmlEncode()方法与上面的功能相同。
代码清单 18-10 LanguageChanges\MyExtensions.cs[3]
Imports System.Runtime.CompilerServices Public Module MyExtensions <Extension()> _ ) System.Web.HttpUtility.HtmlEncode(str) Module当使用VB.NET时,必须将扩展方法声明在一个module中。另外,还必须标记为System.Runtime.CompilerServices.Extension属性。
c# 扩展方法的理解