[英]Is it possible to create an array or collection of functions in vb.net?
我正在編寫一個非常基本的函數,該函數根據要閱讀的人將發往群組郵箱的入站電子郵件分類到文件夾中。 這是一件愚蠢的事情,因為我們都有自己的電子郵件地址,但公司經常做愚蠢的事情!
確定“電子郵件給誰”的標准非常復雜,所以我正在編寫一系列簡單的函數來返回“給”特定人
Function IsRichard(msg As Outlook.MailItem) As Boolean
...
End Function
Function IsTim(msg As Outlook.MailItem) As Boolean
...
End Function
目前,我正在一個控制函數Function WhoIsItFor()
中按順序運行所有這些。 然而,這個子現在變得有點長而且笨拙,所以我想知道是否可以定義一個數組或函數集合,以便我可以做一些類似的事情:
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)
通過上述方法,您可以將相關邏輯放在一個地方:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.