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))); }
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))); } }
/// <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); }
public ProfileExpression Profile(string profileName) { var expression = new ProfileExpression(profileName, this); return(expression); }
public HtmlConventionSettings() { ConventionLibrary = new HtmlConventionLibrary(); _profileExpression = new ProfileExpression(ConventionLibrary, TagConstants.Default); }