如何处理Outlook VSTO对象,就像它们是mailitems一样

时间:2010-11-15 15:30:16

标签: c# reflection vsto polymorphism

我编写了一些VSTO(2003)代码,根据邮件的附件成功应用了一些强制性的主题行更改。代码编写为在microsoft.office.interop.outlook.mailitem上运行但是,我需要相同的代码来操作其他类型,例如microsoft.office.interop.outlook.appointmentitem(事实上它需要适用于任何事情用户可以发送具有主题的内容)。

假设outlook项类型具有subject属性,attachments属性和save方法,我该如何处理编写适用于所有相关interop.outlook类型的代码。

我尝试通过反射解决这个问题,但GetProperty正在撤销null,所以我不能在其上使用GetValue

? mi.GetType().GetProperty("Subject")
null

?(mi as Microsoft.Office.Interop.Outlook.MailItem).Subject
"Test Subject"

似乎没有一个我可以强制转换的通用outlookitem类来执行此操作。什么是正确的方法?

编辑: 为了澄清我的代码就像这样......

    void Application_ItemSend(object Item, ref bool Cancel) 
    {
            if (Item is Microsoft.Office.Interop.Outlook.MailItem) 
            {
                Microsoft.Office.Interop.Outlook.MailItem currentItem = 
                    Item as Microsoft.Office.Interop.Outlook.MailItem;

然后对currentItem执行操作(包括传递给当前使用Microosft.Office.Interop.Outlook.MailItem属性键入的各种函数。我希望它们处理“Microsoft.Interop.Outlook.somethingsendable”

1 个答案:

答案 0 :(得分:4)

这不是开箱即用的工具 - AppointmentItemMailItem是完全不同的接口,因此多态性不是一种选择。

我能建议的最好的是你创建一个自己的SendableItem类来包装你需要支持的PIA接口,并将切换代码封装在一个常见的包装器后面,用于你想要的'常见'操作使用。您可以使用MailItemAppointmentItem创建SendableItem,但一旦创建,它们在SendableItem包装器的外部看起来相同。