65.9K
CodeProject 正在变化。 阅读更多。
Home

VB.NET 中的扩展方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.36/5 (7投票s)

2008年11月26日

CPOL

2分钟阅读

viewsIcon

84274

扩展方法的简要概述。

引言

扩展方法是一个很棒的东西。它们提供了很好的方法来控制例如 Strings、DateTimes 等的输出,或者专门将 DateTimes 转换为可空对象。它们提供了一种向已经可用的公共方法添加新方法的方式,例如 String.<public method>DateTime.Now.<public method>,因此您不必编写帮助函数或子类等。

在本文中,我将解释一些您可以在实际场景中使用此功能的简单方法。本文适用于 VB.NET,但可以轻松转换为 C#。请注意,如果存在语言差异,则会添加要点。

使用代码

让我们开始吧。首先,在您的项目中,在 App_Code 文件夹下,添加一个新模块(使用 ASP.NET,您只能添加一个类;添加此模块,但将语句“Public Class”更改为“Public Module”)并将其命名为 HTMLExtensionMethods,然后打开它。现在,添加以下导入:Imports System.Runtime.CompilerServices

注意:对于 C#,您只需要添加该类,而无需引用编译器服务。

您的新模块应该如下所示

Imports Microsoft.VisualBasic
Imports System.Runtime.CompilerServices

Public Module HTMLExtensionMethods

End Module

要添加扩展方法,您只需编写一个返回对象的函数即可。您必须添加一个与您要扩展的方法相同的参数,即,如果您要扩展 System.String 方法,则 InputValue 也必须是 String。为了使它对编译器可见,从而在 Intellisense 中显示,您必须添加属性:<Extension()>

<Extension()> _
Public Function MethodName(ByVal InputValue As String) As String

End Function

以上显示了完整的函数。此函数是公共 System.String 方法的扩展。这是因为输入值也是一个 String

因此,现在,我们需要做的就是在此模块(或类)中添加一些功能,并在我们的项目中对其进行使用。现在,我将添加一些下面的函数作为示例

<Extension()> _
Public Function ToHTMLBoldString(ByVal InputValue As String) As String
Return String.Concat("<strong>", HttpUtility.HtmlEncode(InputValue), "</strong>")
End Function
<Extension()> _
Public Function ToHTMLItalicString(ByVal InputValue As String) As String
Return String.Concat("<em>", HttpUtility.HtmlEncode(InputValue), "</em>")
End Function
<Extension()> _
Public Function ToHTMLUnderlineString(ByVal InputValue As String) As String
Return String.Concat("<u>", HttpUtility.HtmlEncode(InputValue), "</u>")
End Function
<Extension()> _
Public Function ToHTMLParagraphString(ByVal InputValue As String) As String
Return String.Concat("<p>", HttpUtility.HtmlEncode(InputValue), "</p>")
End Function
<Extension()> _
Public Function ToHTMLBlockQuoteString(ByVal InputValue As String) As String
Return String.Concat("<blockquote>", _
       HttpUtility.HtmlEncode(InputValue), "</blockquote>")
End Function

请注意,我正在使用 HttpUtility.HtmlEncode。这很重要,因为输入可能包含无效的 HTML 标签,例如 <>。

一旦我们添加了我们的函数,我们就可以在我们的主项目代码中使用它。下面的代码显示了如何使用上述一些函数编写 HTML 电子邮件

Dim msg As New Mail.MailMessage
Dim msgBody As New StringBuilder
Dim smtpClient As New Mail.SmtpClient
smtpClient.Port = 25
smtpClient.Host = "127.0.0.1"
msg.To.Add("someone@somewhere.com")
msg.IsBodyHtml = True
msg.Subject = "Test Email"
With msgBody
.Append("Dear Someone".ToHTMLParagraphString)
.Append("Thank you for showing me this. It was really" & _ 
        " handy.".ToHTMLParagraphString)
.Append("See you soon !!!".ToHTMLParagraphString)
End With
msg.Body = msgBody.ToString
smtpClient.Send(msg)

最后,这封电子邮件的输出是

<p>Dear Someone</p>
<p>Thank you for showing me this. It was really handy.</p>
<p> See you soon !!!</p>

可以通过添加参数来改进这些函数。以下会将字符串转换为嵌入的 mailto 链接的参数。

<Extension()> _
Public Function ToHTMLMailtoString(ByVal InputValue As String, _ 
ByVal Subject As String) As String
Return String.Concat("<a href='mailto:", HttpUtility.HtmlEncode(InputValue), _
"?subject=", Subject, "'>", HttpUtility.HtmlEncode(InputValue), "</a>")
End Function

以相同的方式使用此函数,它会将您的电子邮件地址(作为 InputValue)转换为 HTML mailto 锚点。这可以节省相当多的代码行。

关注点

我只触及了扩展方法的表面。您可以做很多事情。但是,一些非常有用的事情可能包括检查您键入的字符串是否使用正则表达式正确格式化。对于 DateTime,当日期小于 01/01/1900 时,您可以返回 DBNulls 等。

© . All rights reserved.