将现有联系人添加到用户的联系人

时间:2016-03-09 19:38:55

标签: c# outlook-addin

我们拥有公司维护的一组公共联系人,但用户只处理其中的一部分,因此他们在本地列表中拥有这些联系人的副本。这些已经过时了。我想从公共联系人中覆盖本地联系人的信息,但除了创建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
        }
    }
}

我不确定&#34;复制信息&#34;中最好的是什么?部分。我可以删除当前联系人并使用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 个答案:

答案 0 :(得分:2)

您可以使用Reflection更新旧联系人对象中的数据,以便完全更新所有属性/字段。如果您使用的是字段而不是属性,请将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中的值进行了更新。