【问题标题】:C# Check if an Outlook Mail item is a true MailItemC# 检查 Outlook 邮件项是否为真正的 MailItem
【发布时间】:2018-09-03 14:24:49
【问题描述】:

我想获得一些帮助的是,使用以下 sn-p 代码确定加载到对象中的 MailItem 的类型。您将看到我从活动的资源管理器选择中加载对象并测试它是否是邮件项目 - 我想避免拾取的是已读回执、会议确认等对象,并测试我想要的每种类型的对象获取它的类型 - 我尝试在下面的 else 语句中测试它 - 但我在调试窗口中得到的只是“不是邮件项目:我是:System.__ComObject”。

        // set the mail item
        object selectedItem = Globals.ThisAddIn.Application.ActiveExplorer().Selection[1];
        // This example uses only MailItem. 
        if (selectedItem is Outlook.MailItem)
        {
            // Cast selectedItem to MailItem. 
            Outlook.MailItem mailItem = selectedItem as Outlook.MailItem;
            // Do something with the MailItem
        }
        else
        {
            // what sort of item are we?
            Debug.WriteLine("I am not a Mail Item: I am a :" + selectedItem.GetType().ToString());
        }

【问题讨论】:

标签: c#


【解决方案1】:

一般情况

Com 对象不一定有“类”,而是支持接口。如果您可以使用CoCreateClass 直接创建它们,或者您可以将它们保存到文件或从文件中加载它们,它们只需要一个“类”。许多对象并非如此,只能通过从其他地方获取它们。

确定它们支持哪些接口的方法是尝试使用IUnknown::QueryInterface 将它们转换为该接口类型。这就是 is 关键字的作用。

可以从文件加载和保存到文件的对象将支持IPersist::GetClassId 获取com 对象的clsid。我相信所有的Item类型都支持IPersist,所以你可以使用这个方法:

在 Outlook 中

在您的情况下,您还有另一种选择。所有 Office 项目类型都支持“类”属性,该属性返回一个枚举,告诉您它们是什么类型。您可以使用反射来调用它:

 OlObjectClass = (OlObjectClass)item.GetType().InvokeMember(
     "Class", 
     BindingFlags.GetProperty|BindingFlags.Public, 
     null, 
     item, 
     null);

你可以把它包装在一个辅助函数中,这样它就不会那么冗长了:

public static class OutlookExtensions {
    public OlObjectClass GetOutlookObjectClass(this object item){
          (OlObjectClass)item.GetType().InvokeMember(
     "Class", 
     BindingFlags.GetProperty|BindingFlags.Public, 
     null, 
     item, 
     null);
    }
}

【讨论】:

  • 感谢您的详细回答...在我提到的示例中如何调用辅助函数?
  • 我为出色的答案提供了 + 1 ......但我很快发现它相当不完整,让我找到一种方法来实现该类,但我尝试了但没有成功......我设法在你的答案后面找到了两个链接, // 来自 msdn.microsoft.com/query/… 和 // msdn.microsoft.com/en-us/library/office/… - 它们结合起来提供了解决方案......
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2016-12-17
  • 2019-07-08
  • 1970-01-01
  • 2018-10-17
  • 2020-06-08
相关资源
最近更新 更多