IIdentifierCreationService.EnsureUniqueIdentifiers Method

Definition

Provides a mechanism to ensure that Activities added to a CompositeActivity are uniquely named.

public void EnsureUniqueIdentifiers(System.Workflow.ComponentModel.CompositeActivity parentActivity, System.Collections.ICollection childActivities);

Parameters

parentActivity
CompositeActivity

The CompositeActivity that will contain the uniquely named activities.

childActivities
ICollection

A collection of activities to ensure that activities are uniquely named.

Examples

The following example shows an implementation of the IIdentifierCreationService. This service ensures that each of the identifiers used within the current workflow is unique.

void IIdentifierCreationService.EnsureUniqueIdentifiers(CompositeActivity parentActivity, ICollection childActivities)
{
    if (parentActivity == null)
        throw new ArgumentNullException("parentActivity");
    if (childActivities == null)
        throw new ArgumentNullException("childActivities");

    List<Activity> allActivities = new List<Activity>();

    Queue activities = new Queue(childActivities);
    while (activities.Count > 0)
    {
        Activity activity = (Activity)activities.Dequeue();
        if (activity is CompositeActivity)
        {
            foreach (Activity child in ((CompositeActivity)activity).Activities)
                activities.Enqueue(child);
        }

        //If we are moving activities, we need not regenerate their identifiers
        if (((IComponent)activity).Site != null)
            continue;

        allActivities.Add(activity);
    }

    // get the root activity
    CompositeActivity rootActivity = GetRootActivity(parentActivity) as CompositeActivity;
    ArrayList identifiers = new ArrayList(); // all the identifiers in the workflow
    identifiers.AddRange(GetIdentifiersInCompositeActivity(rootActivity));

    foreach (Activity activity in allActivities)
    {
        string finalIdentifier = activity.Name;

        // now loop until we find a identifier that hasn't been used.
        string baseIdentifier = GetBaseIdentifier(activity);
        int index = 0;

        identifiers.Sort();
        while (finalIdentifier == null || finalIdentifier.Length == 0 || identifiers.BinarySearch(finalIdentifier.ToLower(), StringComparer.OrdinalIgnoreCase) >= 0)
        {
            finalIdentifier = string.Format("{0}{1}", baseIdentifier, ++index);
        }

        // add new identifier to collection
        identifiers.Add(finalIdentifier);
        activity.Name = finalIdentifier;
    }
}

private static IList GetIdentifiersInCompositeActivity(CompositeActivity compositeActivity)
{
    ArrayList identifiers = new ArrayList();
    if (compositeActivity != null)
    {
        identifiers.Add(compositeActivity.Name);
        IList<Activity> allChildren = GetAllNestedActivities(compositeActivity);
        foreach (Activity activity in allChildren)
            identifiers.Add(activity.Name);
    }
    return ArrayList.ReadOnly(identifiers);
}

private static string GetBaseIdentifier(Activity activity)
{
    string baseIdentifier = activity.GetType().Name;
    StringBuilder b = new StringBuilder(baseIdentifier.Length);
    for (int i = 0; i < baseIdentifier.Length; i++)
    {
        if (char.IsUpper(baseIdentifier[i]) && (i == 0 || i == baseIdentifier.Length - 1 || char.IsUpper(baseIdentifier[i + 1])))
        {
            b.Append(char.ToLower(baseIdentifier[i]));
        }
        else
        {
            b.Append(baseIdentifier.Substring(i));
            break;
        }
    }
    return b.ToString();
}

private static Activity GetRootActivity(Activity activity)
{
    if (activity == null)
        throw new ArgumentException("activity");

    while (activity.Parent != null)
        activity = activity.Parent;

    return activity;
}

private static Activity[] GetAllNestedActivities(CompositeActivity compositeActivity)
{
    if (compositeActivity == null)
        throw new ArgumentNullException("compositeActivity");

    ArrayList nestedActivities = new ArrayList();
    Queue compositeActivities = new Queue();
    compositeActivities.Enqueue(compositeActivity);
    while (compositeActivities.Count > 0)
    {
        CompositeActivity compositeActivity2 = (CompositeActivity)compositeActivities.Dequeue();

        foreach (Activity activity in compositeActivity2.Activities)
        {
            nestedActivities.Add(activity);
            if (activity is CompositeActivity)
                compositeActivities.Enqueue(activity);
        }

        foreach (Activity activity in compositeActivity2.EnabledActivities)
        {
            if (!nestedActivities.Contains(activity))
            {
                nestedActivities.Add(activity);
                if (activity is CompositeActivity)
                    compositeActivities.Enqueue(activity);
            }
        }
    }
    return (Activity[])nestedActivities.ToArray(typeof(Activity));
}

Remarks

Use EnsureUniqueIdentifiers to ensure activities inserted into a CompositeActivity have unique identifiers.

Applies to

제품 버전
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1