是否可以在vb.net中创建一个数组或函数集合



我正在编写一个非常基本的函数,根据收件人将群邮箱的入站电子邮件分类到文件夹中。需要这样做是愚蠢的,因为我们都有自己的电子邮件地址,但公司经常做愚蠢的事!

确定";电子邮件是给谁的";是相当复杂的,所以我正在编写一系列简单的函数,如果它是";对于";特定的人

Function IsRichard(msg As Outlook.MailItem) As Boolean
...
End Function
Function IsTim(msg As Outlook.MailItem) As Boolean
...
End Function

目前,我正在控制函数Function WhoIsItFor()中按顺序运行所有这些。然而,这个sub现在变得有点长,也有点笨拙,所以我想知道是否可以定义一个数组或函数集合,这样我就可以按照的思路做一些事情


Const AllFunctions as Function () = {IsRichard, IsTim ...}
Function WhoIsItFor(msg as Outlook.MailItem) as String

For Each thisFunction as Function in AllFunctions
if thisFunction(msg) then
return (thisFunction.name)
end if
next
end function

您应该使用AddressOf运算符,并使用委托Func:定义数组类型

Dim AllFunctions() As Func(Of Outlook.MailItem, Boolean) = {AddressOf IsRichard, AddressOf IsTim}
Function WhoIsItFor(msg As Outlook.MailItem) As String
For Each thisFunction As Func(Of Outlook.MailItem, Boolean) In AllFunctions
If thisFunction(msg) Then
Return thisFunction.Method.Name
End If
Next
Return Nothing
End Function

另一种方法是创建一个类(vb.net是一种面向对象的语言;(来表示一个人(或任何可以对电子邮件做出"反应"的东西(
使用这种方法,当您添加或删除不需要触摸的人员时"主";处理电子邮件的代码。

' Create an abstraction to represent mail handler
Public Interface IMailHandler
Function CanHandle(MailItem mail) As Boolean
Sub Handle(MailItem mail)
End Interface
' Implement for Tim
Public Class Tim Inherits IMailPerson
Public Function CanHandle(MailItem mail) As Boolean
Return mail.Subject = "For Tim"
End Function
Public Sub Handle(MailItem mail)
' Move to Tim folder
End Sub
End Class
' Implement for Bob
Public Class Bob Inherits IMailPerson
Public Function CanHandle(MailItem mail) As Boolean
' Can be anything else
End Function
Public Sub Handle(MailItem mail)
' Delete Bob messages
End Sub
End Class

使用

Dim handlers As New List(Of IMailHandler) From { New Tim(), New Bob() }
var handler = handlers.
Where(Function (h) h.CanHandle(mail)).
DefaultIfEmpty(new DefaultHandler()).
First()
handler.Handle(mail)

通过上述方法,您可以将相关逻辑保留在一个位置:

  • 关于";这封邮件可以处理吗
  • 此邮件的实际操作

最新更新