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