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);
 }
Ejemplo n.º 11
0
 public static void RunTest(IOvBuilderContext context, Action assertion)
 {
     try
     {
         assertion();
     }
     finally
     {
         Console.WriteLine($"exp:{Environment.NewLine}{context.GetDebugInfo()}");
     }
 }
Ejemplo n.º 12
0
        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 !;
Ejemplo n.º 14
0
        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);
        }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        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);
        }
Ejemplo n.º 18
0
        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 !));