【问题标题】:Add Existing Contact to User's Contacts将现有联系人添加到用户的联系人
【发布时间】:2016-03-09 19:38:55
【问题描述】:

我们有一组公司维护的公共联系人,但用户只处理其中的一部分,因此他们在本地列表中拥有这些联系人的副本。这些已经过时了。我想从公共联系人中覆盖本地联系人的信息,但除了创建 ContactItem 然后手动将每个属性设置为来自公众的值之外,找不到更简单的方法。有没有更简单的方法可以将现有联系人添加到本地列表中?

我现在在做什么

// Get the public folder for the contacts
session = Application.GetNamespace("MAPI"); // Application is Outlook
sessionFolders = session.Foldeers;
publicFolders = sessionFolders["Public Folders"];
publicContacts = publicFolders["Public Contacts"];
publicContactsItems = publicContacts.Items;

localContacts = session.GetDefaultFolder(Outlook.OlDefaultFoldes.olFolderContacts);
localContactItems = localContacts.Items;

for(int p = 1; p <= publicContactItems.Count; p++)
{
    var pContact = publicContactItems[p];
    // Search for the contact in the users local list
    for(int l = 1; p <= localContactItems.Count; l++)
    {
        var lContact = localContactItems[l];
        if(publicContact.Email1Address == localContact.Email1Address)
        {
            // Copy information. 
            // DOING localContacts.Items.Add(publicContact) DOES NOT WORK!
            // lContact = pContact doesn't work either.
            // lContact.FirstName = pContact.FirstName; lContact.Save(); does
        }
    }
}

我不确定“复制信息”部分的最佳选择。我可以删除当前联系人并使用Application.CreateItem(OlItemType.olContactItem) 创建一个新联系人,或者我可以使用当前项目,覆盖属性并保存。不过,无论哪种方式都有很多属性。

编辑:我可能没有添加足够的信息。 ContactItem 是 Outlook 类,而不是我创建的对象。所有这些代码都在 Outlook 加载项中。我添加了更多代码来显示这一点。

EDIT NUMERO DOS:使用@ext0 答案和另一个问题作为参考,我能够解决它。

对@ext0 答案的轻微修改

if (lContact.Email1Address == pContact.Email1Address)
{
    var lProperties = lContact.ItemProperties
    var pProperties = pContact.ItemProperties
    for (i = 0; i < pProperties.Count; i++) // ItemProperties goes back 0 index, keep it up Microsoft!
    {
        try { lProperties[i].Value = pProperties[i].Value} 
        catch{}  // Even though Value is read/write, some properties are read-only
    }
    lContact.Save();
}

记住孩子们!使用后始终释放您的 com 对象!

【问题讨论】:

  • 首先,你为什么从索引 1 开始? C# 中的可枚举集从 0 开始。另外,当您尝试运行 localContacts.Items.Add(publicContact) 时会抛出什么异常确切
  • 来自 Items 对象 The index for the Items collection starts at 1, and the items in the Items collection object are not guaranteed to be in any particular order. 的 MSDN 页面,异常没有给我异常类型,但消息是“抱歉,出了点问题。您可能想试试 agian。”
  • 我很抱歉。是否可以就地修改对象?
  • 没问题!我不确定您所说的“修改”是什么意思。像 localContact = publicContactlocalContact.FirstName = publicContact.FirstName 这样的东西。第一个不起作用,第二个起作用。
  • 好的,那么我建议我在下面列出的解决方案可能对您有用。 :)

标签: c# outlook-addin


【解决方案1】:

您可以使用反射更新旧联系人对象中的数据,以完全更新所有属性/字段。如果您使用字段而不是属性,只需将GetProperties() 替换为GetFields()。以下代码将oldContact 的内容替换为newContact 的所有属性值。

public static void Main()
{
    Contact oldContact = new Contact{
        name = "John", 
        email = "John@example.com", 
        age = 40
    };
    Contact newContact = new Contact{
        name = "Joshua",
        email = "John@example.com",
        age = 42
    };
    Type contactType = oldContact.GetType();
    foreach (PropertyInfo property in contactType.GetProperties())
    {
        property.SetValue(oldContact, property.GetValue(newContact));
    }
    Console.WriteLine(oldContact.age);
}

public class Contact
{
    public String name { get; set; }
    public String email { get; set; }
    public int age { get; set; }
}

此代码将打印出 42,因为 oldContact 已使用来自 newContact 的值进行了更新。

【讨论】:

  • 对不起,我认为我没有在我的 OP 上添加足够的信息。联系人对象是 Outlook 对象,localContact 中的 GetType() 方法返回 System._ComObject。无论如何我都试过了,它没有用。 :( 但是,这似乎对我正在处理的其他事情非常有用。谢谢!
  • 太棒了!使用这个问题stackoverflow.com/questions/1323069/… 我能够解决差异。谢谢!
  • 很高兴我能帮上忙!干杯!
猜你喜欢
  • 1970-01-01
  • 2012-06-17
  • 2014-10-05
  • 2013-03-15
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多