Search code examples
exchangewebservicesews-managed-api

How can I remove a contact CompleteName.Title with EWS managed api v1.1?


Using EWS managed api v1.1, I can successfully save/set the contact "Title" or honorific (if you prefer) to a non-empty value, but I can't figure out how to remove or set it back to an empty string/null.

I've tried to set an empty value and I've tried to remove the extended property. Here is relevant code.

var titleDef = new ExtendedPropertyDefinition(0x3A45, MapiPropertyType.String);

// works when set to a non-empty string value
ewsContact.SetExtendedProperty(titleDef, "Mr.");

// throws null argument exception when set to String.Empty or null
ewsContact.SetExtendedProperty(propDefinition, String.Empty);

// isRemoved is equal to false and the value doesn't change
var isRemoved = ewsContact.RemoveExtendedProperty(titleDef);

I've also tried to use a different overload on the ExtendedPropertyDefinition as mentioned in this very similar question, but it didn't change my end result for removing the property. I'm not sure I understand the difference in the two signatures for the constructor.

var titleDef = new ExtendedPropertyDefinition(new Guid("{00062004-0000-0000-C000-000000000046}"), 0x3A45, MapiPropertyType.String);

// isRemoved is equal to false and the value doesn't change
var isRemoved = ewsContact.RemoveExtendedProperty(titleDef);

Brute Force Work-Around

I suppose I could take a complete copy of the contact (without the title) and delete the original, but that seems a bit over the top and would probably cause other bugs.


Solution

  • EWS lets you assign Extended Properties without first binding them. However, to remove an Extended Property - you need to include it in your initial binding call PropertySet. The following worked for me...

     var titleDef = new ExtendedPropertyDefinition(0x3A45, MapiPropertyType.String);
     Contact contact = Contact.Bind(service, id, new PropertySet(titleDef));
     contact.RemoveExtendedProperty(titleDef);
     contact.Update(ConflictResolutionMode.AutoResolve);
    

    It is also strange that you can retrieve the Title as a first-class property, but you cannot assign it (since it's a complex type). They could have made this easier for us.

    var title = contact.CompleteName.Title;