Exemple #1
0
            public static Func <object, TResult> Create(ProfileExpression <T> profile, Type sourceType)
            {
                var standardType = sourceType.IsNullable() ? Nullable.GetUnderlyingType(sourceType) : sourceType;

                if (profile.Routers.Count > 0 || profile.Invokers.Count > 0)
                {
                    return(CreateByExtra(profile, standardType, conversionType));
                }

                return(ProfileTypeCache.GetOrAdd(standardType, _ => profile.CreateExpression <TResult>(standardType)));
            }
Exemple #2
0
            private static Func <object, TResult> CreateByExtra(ProfileExpression <T> profile, Type sourceType, Type conversionType)
            {
                if (profile.SyncRoot.Value)
                {
                    goto label_core;
                }

                if (profile.Invokers.TryGetValue(conversionType, out IInvoker invoker) && (invoker is Invoker <TResult> invoke))
                {
                    profile.SyncRoot.Value = true;

                    try
                    {
                        return(invoke.Invoke.Invoke((T)profile, sourceType));
                    }
                    finally
                    {
                        profile.SyncRoot.Value = false;
                    }
                }

label_core:
                {
                    if (profile.Routers.Count > 0)
                    {
                        foreach (IDispatcher <TResult> router in profile.Routers.Where(x => x.ConversionType == conversionType))
                        {
                            if (router.CanResolve(sourceType))
                            {
                                return(router.Resolve);
                            }
                        }
                    }

                    return(ProfileTypeCache.GetOrAdd(sourceType, _ => profile.CreateExpression <TResult>(sourceType)));
                }
            }
Exemple #3
0
        /// <summary>
        /// An alternative way to use CreateProfile that uses ProfileExpression
        /// as a Nested Closure.  This usage will result in cleaner code for
        /// multiple declarations
        /// </summary>
        /// <param name="profileName"></param>
        /// <param name="action"></param>
        public void Profile(string profileName, Action <ProfileExpression> action)
        {
            var expression = new ProfileExpression(profileName, this);

            action(expression);
        }
Exemple #4
0
        public ProfileExpression Profile(string profileName)
        {
            var expression = new ProfileExpression(profileName, this);

            return(expression);
        }
 public HtmlConventionSettings()
 {
     ConventionLibrary  = new HtmlConventionLibrary();
     _profileExpression = new ProfileExpression(ConventionLibrary, TagConstants.Default);
 }