• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C# IIdentifierCreationService接口代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了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;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# IHasXmlNode接口代码示例发布时间:2022-05-26
下一篇:
C# IDesignerGlyphProvider接口代码示例发布时间:2022-05-26
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap