无法将类型 'system.object' 的对象转换为类型 'Microsoft.Office.Interop.Outlook.Folder'

Unable to cast object of type 'system.object' to type 'Microsoft.Office.Interop.Outlook.Folder'

我有这个 Outlook 加载项(用 VB.Net 编写,已经工作多年了。最近用户在安装加载项时尝试通过加载项在 outlook 中创建文件夹-在,他们收到此错误:

Unable to cast object of type 'system.object' to type 'Microsoft.Office.Interop.Outlook.Folder'

这是我的代码

    Public Function FindOLFolderByFolderName(ByVal TFolder As Outlook.Folder, ByVal FolderName As String) As Object
    Dim ReturnValue As New Object
    Try
        Dim SubFolder As Outlook.Folder

        For Each SubFolder In TFolder.Folders
            If SubFolder.Name = FolderName Then
                ReturnValue = SubFolder
                Exit For
            Else
                ReturnValue = Nothing
            End If
        Next

    Catch ex As Exception
        MsgBox(ex.Message.ToString)
    Finally
        ''
    End Try
    Return ReturnValue
    End Function

以上函数由以下代码调用:

        Dim InboxF As Outlook.Folder
        Dim WorkingCasesF As Outlook.Folder
        Try
            InboxF = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
            WorkingCasesF = FindOLFolderByFolderName(InboxF, GetFolderNameFromDB("Parent"))

            If IsNothing(WorkingCasesF) Then
                WorkingCasesF = InboxF.Folders.Add(GetFolderNameFromDB("Parent"))
            End If
        Catch ex As Exception
            MsgBox(ex.Message.ToString)
        Finally
           ''
        End Try

我特别在这行代码中收到错误

WorkingCasesF = FindOLFolderByFolderName(InboxF, GetFolderNameFromDB("Parent"))

事实是这一切正常。我不确定最新版本的 Outlook 是否破坏了它...你能指导我在这里需要做什么来修复这个错误吗?

问题应该在这里:

Dim ReturnValue As New Object

'...

Return ReturnValue

您实际上是在创建 Object class 的实例,如果该变量未在其他任何地方设置,则 return 对其进行设置。不要使用 New 关键字,除非你真的想调用一个构造函数来创建一个新对象。在这种情况下,您不希望这样。该代码清楚地表明您想要 return 文件夹或 Nothing 那么 Object 实例的用途是什么?它不是为了任何东西,所以根本不应该创建它。该代码应该是这样的:

Public Function FindOLFolderByFolderName(ByVal TFolder As Outlook.Folder, ByVal FolderName As String) As Object
    Dim ReturnValue As Object = Nothing

    Try
        For Each SubFolder As Outlook.Folder In TFolder.Folders
            If SubFolder.Name = FolderName Then
                ReturnValue = SubFolder
                Exit For
            End If
        Next
    Catch ex As Exception
        MsgBox(ex.Message.ToString)
    Finally
        ''
    End Try

    Return ReturnValue
End Function

当然,如果您实际上是在没有设置该变量的情况下进入 Return 语句,那么这似乎表明在代码命中设置它的任何一个语句之前抛出异常,所以这是一个你无论如何都需要研究的问题。