當前位置: 首頁>>代碼示例>>C#>>正文


C# IIdentifierCreationService接口代碼示例

本文整理匯總了C#中System.Workflow.ComponentModel.Design.IIdentifierCreationService接口的典型用法代碼示例。如果您正苦於以下問題:C# IIdentifierCreationService接口的具體用法?C# IIdentifierCreationService怎麽用?C# IIdentifierCreationService使用的例子?那麽, 這裏精選的接口代碼示例或許可以為您提供幫助。


IIdentifierCreationService接口屬於System.Workflow.ComponentModel.Design命名空間,在下文中一共展示了IIdentifierCreationService接口的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C#代碼示例。

示例1: IdentifierCreationService

internal sealed class IdentifierCreationService : IIdentifierCreationService
{
    private IServiceProvider serviceProvider = null;

    internal IdentifierCreationService(IServiceProvider serviceProvider)
    {
        this.serviceProvider = serviceProvider;
    }

    void IIdentifierCreationService.ValidateIdentifier(Activity activity, string identifier)
    {
        if (identifier == null)
            throw new ArgumentNullException("identifier");
        if (activity == null)
            throw new ArgumentNullException("activity");

        if (activity.Name.ToLower().Equals(identifier.ToLower()))
            return;

        ArrayList identifiers = new ArrayList();
        Activity rootActivity = GetRootActivity(activity);
        identifiers.AddRange(GetIdentifiersInCompositeActivity(rootActivity as CompositeActivity));
        identifiers.Sort();
        if (identifiers.BinarySearch(identifier.ToLower(), StringComparer.OrdinalIgnoreCase) >= 0)
            throw new ArgumentException(string.Format("Duplicate Component Identifier {0}", identifier));
    }

    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));
    }
}
開發者ID:.NET開發者,項目名稱:System.Workflow.ComponentModel.Design,代碼行數:153,代碼來源:IIdentifierCreationService


注:本文中的System.Workflow.ComponentModel.Design.IIdentifierCreationService接口示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。