public static IObjectVisitor CreateVisitor(this IOvBuilderContext builderContext) { var factory = OvFactory.Instance; var visitor = factory.Create(builderContext); return(visitor); }
public static bool TryGetObject <T>(this IOvBuilderContext <T> builderContext, out T obj) { var re = TryGetContextItem <SourceObjectOvBuilderContextItem>(builderContext, out var item); obj = (T)item?.SourceObject !; return(re); }
public static ICachedObjectVisitor <T, TExtend> Cache <T, TExtend>( this IOvBuilderContext <T, TExtend> builderContext) { var visitor = builderContext.CreateVisitor(); return(new CachedObjectVisitor <T, TExtend>(visitor)); }
public static IObjectVisitor <T> CreateVisitor <T>(this IOvBuilderContext <T> builderContext) { var factory = OvFactory.Instance; var visitor = factory.Create(builderContext); return(new ObjectVisitor <T>(visitor)); }
public static bool TryGetExtObject <T, TExtend>(this IOvBuilderContext <T, TExtend> builderContext, out TExtend obj) { var re = TryGetContextItem <ExtendObjectOvBuilderContextItem>(builderContext, out var item); obj = (TExtend)item?.ExtendObject !; return(re); }
public static void Run <T, TExtend>(this IOvBuilderContext <T, TExtend> builderContext) { if (!builderContext.TryGetObject <T>(out var obj)) { throw new MissingSourceObjectException(); } builderContext.Run(obj); }
public static void Run <T, TExtend>(this IOvBuilderContext <T, TExtend> builderContext, T obj) { if (builderContext.TryGetExtObject(out var extend)) { builderContext.Run(obj, extend); return; } throw new MissingExtendObjectException(); }
public static void Run <T>(this IOvBuilderContext <T> builderContext) { if (builderContext.TryGetObject(out var obj)) { builderContext.Run(obj); return; } throw new MissingSourceObjectException(); }
public static IOvBuilderContext <T> ForEach <T>(this IOvBuilderContext <T> builderContext, Expression <Action <IObjectVisitorContext <T, object> > > foreachAction) { builderContext.Add(new ForEachActionContextItem { ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.ObjectVisitorContext }); return(builderContext); }
public static IOvBuilderContext <T> ForEach <T>(this IOvBuilderContext <T> builderContext, Expression <Action <string, object> > foreachAction) { builderContext.Add(new ForEachActionContextItem { ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.NameAndValue }); return(builderContext); }
public static void RunTest(IOvBuilderContext context, Action assertion) { try { assertion(); } finally { Console.WriteLine($"exp:{Environment.NewLine}{context.GetDebugInfo()}"); } }
public IObjectVisitor Create(IOvBuilderContext builderContext) { foreach (var handler in _handlers) { var exp = handler.CreateExpression(builderContext); if (exp != null) { return(new ObjectVisitor(exp !)); } } throw new MissingBuilderContextHandlerException(); }
internal static bool TryGetContextItem <TItem>(this IOvBuilderContext builderContext, out TItem?obj) where TItem : class { var item = builderContext.OfType <TItem>().FirstOrDefault(); if (item != null) { obj = item; return(true); } obj = default !;
public static IOvBuilderContext <T> ForEach <T>(this IOvBuilderContext <T> builderContext, Expression <Action <string, object> > foreachAction, Func <PropertyInfo, bool>?propertyInfoFilter = null) { var filter = propertyInfoFilter ?? PropertyInfoFilters.AllPropertyInfo; builderContext.Add(new ForEachActionContextItem { PropertyInfoFilter = filter, ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.NameAndValue }); return(builderContext); }
public static IOvBuilderContext <T> ForEach <T, TValue>(this IOvBuilderContext <T> builderContext, Expression <Action <string, TValue> > foreachAction, Func <PropertyInfo, bool>?propertyInfoFilter = null) { var filter = propertyInfoFilter ?? (x => x.PropertyType == typeof(TValue)); builderContext.Add(new ForEachActionContextItem { ValueExpectedType = typeof(TValue), PropertyInfoFilter = filter, ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.NameAndValue }); return(builderContext); }
public static IOvBuilderContext <T, TExtend> ForEach <T, TExtend>( this IOvBuilderContext <T, TExtend> builderContext, Expression <Action <IObjectVisitorContext <T, TExtend, object> > > foreachAction, Func <PropertyInfo, bool>?propertyInfoFilter = null) { var filter = propertyInfoFilter ?? PropertyInfoFilters.AllPropertyInfo; builderContext.Add(new ForEachActionContextItem { PropertyInfoFilter = filter, ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.ObjectVisitorContextWithExtend }); return(builderContext); }
public Expression?CreateExpression(IOvBuilderContext builderContext) { var items = builderContext.OfType <T>().ToArray(); if (items.Any()) { var inputType = builderContext.OfType <SourceObjectOvBuilderContextItem>() .First() .InputType; var extendType = builderContext.OfType <ExtendObjectOvBuilderContextItem>() .FirstOrDefault() ?.ExtendObjectType; var exps = CreateExpressions(); if (items.Length == 1) { return(exps.Single()); } var pExp = Expression.Parameter(inputType, "s"); if (extendType != null) { var sourceExp = Expression.Parameter(extendType, "e"); var blockItems = exps.Select(x => Expression.Invoke(x, pExp, sourceExp)); var blockExpression = Expression.Block(blockItems); var actionType = Expression.GetActionType(inputType, extendType); var finalExp = Expression.Lambda(actionType, blockExpression, pExp, sourceExp); return(finalExp); } else { var blockItems = exps.Select(x => Expression.Invoke(x, pExp)); var blockExpression = Expression.Block(blockItems); var actionType = Expression.GetActionType(inputType); var finalExp = Expression.Lambda(actionType, blockExpression, pExp); return(finalExp); } IEnumerable <Expression> CreateExpressions() { foreach (var item in items) { yield return(CreateCore(inputType, extendType, item)); } } } return(null); }
public static IOvBuilderContext <T, TExtend> ForEach <T, TExtend, TValue>( this IOvBuilderContext <T, TExtend> builderContext, Expression <Action <IObjectVisitorContext <T, TExtend, TValue> > > foreachAction, Func <PropertyInfo, bool>?propertyInfoFilter = null) { var filter = propertyInfoFilter ?? (x => x.PropertyType == typeof(TValue)); builderContext.Add(new ForEachActionContextItem { ValueExpectedType = typeof(TValue), PropertyInfoFilter = filter, ForEachAction = foreachAction, ExpressionType = ForEachActionContextExpressionType.ObjectVisitorContextWithExtend }); return(builderContext); }
public Expression?CreateExpression(IOvBuilderContext builderContext) { var item = builderContext.OfType <T>().LastOrDefault(); if (item != null) { var inputType = builderContext.OfType <SourceObjectOvBuilderContextItem>() .First() .InputType; var extendType = builderContext.OfType <ExtendObjectOvBuilderContextItem>() .FirstOrDefault() ?.ExtendObjectType; return(CreateCore(inputType, extendType, item)); } return(null); }
public static Action <T, TExtend> GetLambda <T, TExtend>( this IOvBuilderContext <T, TExtend> builderContext) { builderContext.CreateVisitor().TryCreateActionExpression <T, TExtend>(out var action); return(action.Compile()); }
public OvBuilderContext( IOvBuilderContext context) { _context = context; }
public static void Run <T>(this IOvBuilderContext <T> builderContext, T obj) { var visitor = builderContext.CreateVisitor(); visitor.Run(obj); }
public static string GetDebugInfo(this IOvBuilderContext context) { var visitor = context.CreateVisitor(); return(GetDebugInfo(visitor)); }
public static void Run <T, TExtend>(this IOvBuilderContext <T, TExtend> builderContext, T obj, TExtend extendObj) { var visitor = builderContext.CreateVisitor(); visitor.Run(obj, extendObj); }
public static IOvBuilderContext <T, TExtend> WithExtendObject <T, TExtend>(this IOvBuilderContext <T> context) { return(context.WithExtendObject <T, TExtend>(default !));