我最想念的是这里,
请参阅我在调试会话中创建的图像。
(items[i] is MailItem)
根据调试器为FALSE,但仍会输入if
语句。
我在这里想念什么?
。
作为参考,这是此方法的完整代码
private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
MailItem Result = null;
Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
Items items = myInbox.Items;
int count = items.Count;
MailItem mail = null;
int i = 1; //DO NOT START ON 0
while ((i < count) && (Result == null))
{
if (items[i] is MailItem)
{
mail = (MailItem)items[i];
if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
{
Result = mail;
}
}
i++;
}
return Result;
}
答案 0 :(得分:1)
This这样的回答解释了为什么即使看到IF
里面的false
条件也被传递的原因。显然,这是调试器和多个线程的问题。此外,它还建议使用lock
来防止此问题的解决方法。希望对您有所帮助。
答案 1 :(得分:0)
我使用了Wai Ha Lee提供的the link来解决。但是我不得不更改它,因为测试项目是否为MailItem仍然表现异常。
因此,我首先将这些项目复制到一个单独的列表中,并确保该列表中仅包含MailItem类型的项目。
我得到此过滤的唯一方法是使用try...catch
,我仍然希望有一种更好的方法,而且我仍然好奇为什么测试if (items[i] is MailItem)
的表现如此奇怪。
List<MailItem> ReceivedEmail = new List<MailItem>();
foreach (var testMail in items)
{
try
{
ReceivedEmail.Add((MailItem)testMail);
}
catch (System.Exception ex)
{
;
}
}
此后,我可以使用列表ReceivedEmail
,而无需检查MailItem。