簡體   English   中英

是否可以在 vb.net 中創建數組或函數集合?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM