2009-09-17 8 views
6

ho la classe seguente che ha lo scopo di restituire l'oggetto di tutti i messaggi di posta elettronica in una cartellaenumerazione Outlook casella di posta utilizzando Visual Studio

Si tratta di Visual Studio 2008 contro Outlook 2007 in esecuzione su Windows 7 a 64 bit

using System; 
using System.Windows; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Office.Interop.Outlook; 

namespace MarketingEmails 
{ 
public class MailUtils 
{ 

    public static string[] processMailMessages(object outlookFolder) 
    // Given an Outlook folder as an object reference, return 
    // a list of all the email subjects in that folder 
    { 

     // Set a local object from the folder passed in 
     Folder theMailFolder = (Folder)outlookFolder; 

     string[] listSubjects = new string[theMailFolder.Items.Count]; 
     int itemCount = 0; 

     // Now process the MAIL items 
     foreach (MailItem oItem in theMailFolder.Items) 
     { 
      listSubjects[itemCount] = oItem.Subject.ToString(); 
      itemCount++; 
     } 
     return listSubjects; 
    } 

} 

}

Tuttavia il codice genera l'eccezione di seguito:

Impossibile eseguire il cast di oggetti COM di tipo 'sistema di .__ ComObject' al tipo di terface 'Microsoft.Office.Interop.Outlook.MailItem'. Questa operazione non è riuscita perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{00063034-0000-0000-C000-000000000046}' non è riuscita a causa del seguente errore: Nessuna interfaccia supportata (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)) .

Capisco che l'errore si è verificato perché sta tentando di elaborare un ReportItem nella cassetta postale selezionata.

Quello che non capisco è il motivo per cui è cercare di processo ro non elementi di posta quando ho specificato:

foreach (MailItem oItem in theMailFolder.Items) 

Se avessi voluto per elaborare report voci voce nella casella di posta avrei scritta:

foreach (ReportItem oItem in theMailFolder.Items) 

avrei caro piacerebbe scoprire se questo è un bug o se è solo la mia malintesi

Saluti , Nigel Ainscoe

risposta

8

Il motivo è che la raccolta Articoli contiene sia le istanze di MailItem che di ReportItem. Specificare MailItem sulla sinistra non filtra l'elenco, semplicemente indica quale tipo si aspetta di essere nella lista.

Quello che dovete fare è il filtro del tipo che si desidera in questo modo

foreach (MailItem oItem in theMailFolder.Items.OfType<MailItem>()) { 
    .. 
} 

Il metodo OfType restituirà solo i valori all'interno della collezione che corrisponde a quel tipo particolare.

+0

Che funziona un piacere - grazie –

+0

Oh bel trucco JaredPar molto bello. –

2

La dichiarazione del tipo nel ciclo foreach non filtra in base al tipo: al suo posto genera un'eccezione, come avete notato.

Fa ciò perché foreach è stato introdotto in C# 1.0, che non supportava i generici. Pertanto, non è possibile per il compilatore sapere quale tipo viene restituito dallo IEnumerator. (Questo è ancora vero se la raccolta non implementa IEnumerable<T>). Nitpickers: So che è possibile anche in C# 1 scrivere un enumeratore fortemente tipizzato (come fa List<T>); la stragrande maggioranza no.

Quindi, se si inserisce accidentalmente il tipo errato nello foreach, si preferisce che venga generata un'eccezione piuttosto che misteriosamente non fare nulla.

Come spiegato da JaredPar, è necessario utilizzare il metodo OfType.

+1

OK, questo getta un po 'di luce su ciò che a me sembrava un'assurdità. Grazie per l'illuminazione. –

Problemi correlati