예제 #1
0
        private static void IterateEnumerable(BindingContext context,
                                              BlockParamsValueProvider blockParamsValueProvider,
                                              IEnumerable target,
                                              Action <BindingContext, TextWriter, object> template,
                                              Action <BindingContext, TextWriter, object> ifEmpty)
        {
            using (var iterator = IteratorValueProvider.Create())
            {
                blockParamsValueProvider?.Configure(BlockParamsEnumerableConfiguration, iterator);

                iterator.Index = 0;
                var  enumerable = new ExtendedEnumerable <object>(target);
                bool enumerated = false;

                foreach (var enumerableValue in enumerable)
                {
                    enumerated     = true;
                    iterator.Value = enumerableValue.Value;
                    iterator.First = enumerableValue.IsFirst;
                    iterator.Last  = enumerableValue.IsLast;

                    using (var innerContext = context.CreateChildContext(iterator.Value))
                    {
                        innerContext.RegisterValueProvider(iterator);
                        template(context, context.TextWriter, innerContext);
                        innerContext.UnregisterValueProvider(iterator);
                    }
                }

                if (iterator.Index == 0 && !enumerated)
                {
                    ifEmpty(context, context.TextWriter, context.Value);
                }
            }
        }
예제 #2
0
        private static void IterateObject(BindingContext context,
                                          ObjectDescriptor descriptor,
                                          BlockParamsValueProvider blockParamsValueProvider,
                                          object target,
                                          IEnumerable <object> properties,
                                          Type targetType,
                                          Action <BindingContext, TextWriter, object> template,
                                          Action <BindingContext, TextWriter, object> ifEmpty)
        {
            using (var iterator = ObjectEnumeratorValueProvider.Create(context.Configuration))
            {
                blockParamsValueProvider?.Configure(BlockParamsObjectEnumeratorConfiguration, iterator);

                iterator.Index = 0;
                var  accessor   = descriptor.MemberAccessor;
                var  enumerable = new ExtendedEnumerable <object>(properties);
                bool enumerated = false;

                foreach (var enumerableValue in enumerable)
                {
                    enumerated   = true;
                    iterator.Key = enumerableValue.Value.ToString();
                    var key = iterator.Key.Intern();
                    iterator.Value = accessor.TryGetValue(target, targetType, key, out var value) ? value : null;
                    iterator.First = enumerableValue.IsFirst;
                    iterator.Last  = enumerableValue.IsLast;
                    iterator.Index = enumerableValue.Index;

                    using (var innerContext = context.CreateChildContext(iterator.Value))
                    {
                        innerContext.RegisterValueProvider(iterator);
                        template(context, context.TextWriter, innerContext);
                        innerContext.UnregisterValueProvider(iterator);
                    }
                }

                if (iterator.Index == 0 && !enumerated)
                {
                    ifEmpty(context, context.TextWriter, context.Value);
                }
            }
        }