Code Snippet: Delegate-based APIs

// Example: Action-based API (class library)

public

void ChangeItem(PropValue[] propsToSet, params Action<MapiMessage>[] actions)
{
using (MapiMessage mapiMessage = collector.ImportMessageChange( /* Contents Elided */ ))
{
foreach (Action<MapiMessage> action in actions)
{
action(mapiMessage);
}
mapiMessage.SaveChanges();
}
}

// Example: Action-based API (client)

Action

<MapiMessage> copyProps = new Action<MapiMessage>(delegate(MapiMessage mapiMessage)
{
using (MapiMessage sourceMessage = store.OpenEntry(messageProp[PropTag.EntryId].GetBytes()) as MapiMessage)
{
List<PropTag> propTagsToInclude = excludePropTags(new List<PropTag>(PropTagGroup.GetApptProps(store)), propsToExclude);
PropProblem[] problems = sourceMessage.CopyProps(mapiMessage, propTagsToInclude.ToArray());
}
});

Action

<MapiMessage> modifyRecipients = new Action<MapiMessage>(delegate(MapiMessage message)
{
message.ModifyRecipients(ModifyRecipientsFlags.AddRecipients,
new AdrEntry(
new PropValue(PropTag.DisplayName, "userInfo.DisplayName"),
new PropValue(PropTag.RecipientType, (int)RecipientType.To),
new PropValue(PropTag.AddrType, "EX"),
new PropValue(PropTag.EmailAddress, "userInfo.LegacyDn")));
});

outboxProp.SendItem(propsToSet.ToArray(), copyProps, modifyRecipients);

// Example: Predicate

Predicate

<PropValue> hasNoError = new Predicate<PropValue>(delegate(PropValue propValue)
{
if (propValue.IsNull() || propValue.IsError()) return false;
return true;
});

PropValue[] sourceProps = null;
PropValue[] destProps = Array.FindAll(sourceProps, hasNoError);

// Example: Converter

Converter

<PropValue, PropTag> getPropTag = new Converter<PropValue,PropTag>(delegate(PropValue propValue)
{
return propValue.PropTag;
});

PropValue

[] propValues = null;
PropTag[] propTags = Array.ConvertAll(propValues, getPropTag);

// Example: Comparision

Comparison

<PropValue> compareProp = new Comparison<PropValue>(delegate(PropValue lhs, PropValue rhs)
{
int propTag = Comparer<int>.Default.Compare((int)lhs.PropTag, (int)rhs.PropTag);
if (propTag != 0) return propTag;
if (object.Equals(lhs.Value, rhs.Value)) return 0;
return -1;
});

Array

.Sort<PropValue>(propValues, compareProp);