C#检查Outlook Mail项是否是真正的MailItem

时间:2018-03-25 09:56:41

标签: c#

我希望得到一些帮助,是使用以下代码片段确定加载到对象中的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());
        }

1 个答案:

答案 0 :(得分:0)

一般

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

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

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

在Outlook中

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

 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);
    }
}