private static void AddDefaultCollectionProcessorFactories(this SpecFlowContext context)
        {
            const string defaultKey = "__defaultCollectionProcessorFactoriesAdded__";

            if (context.ContainsKey(defaultKey) && context.GetEx <bool>(defaultKey))
            {
                return;
            }

            context.Set(true, defaultKey);

            var lookup        = new Dictionary <string, CollectionProcessorFactory>(StringComparer.OrdinalIgnoreCase);
            var listProcessor = new ListProcessorFactory(context);

            AddToLookup(new ArrayProcessorFactory(context));
            AddToLookup(new EnumerableProcessorFactory(context));
            AddToLookup(new ICollectionProcessorFactory(context));
            AddToLookup(new IListProcessorFactory(context));
            AddToLookup(new IReadOnlyCollectionProcessorFactory(context));
            AddToLookup(new IReadOnlyListProcessorFactory(context));
            AddToLookup(listProcessor);

            SetCollectionProcessorFactoryLookup(context, lookup);
            SetDefaultCollectionProcessorFactory(context, listProcessor);

            void AddToLookup(CollectionProcessorFactory factory)
            => factory.CollectionKindNames.ForEach(n => lookup.Add(n, factory));
        }
        private static void AddDefaultValueProcessors(this SpecFlowContext context)
        {
            const string defaultKey = "__defaultValueProcessorsAdded__";

            if (context.ContainsKey(defaultKey) && context.GetEx <bool>(defaultKey))
            {
                return;
            }

            context.Set(true, defaultKey);

            var typeLookup = new Dictionary <Type, IValueProcessor>();
            var lookup     = new Dictionary <string, IValueProcessor>(StringComparer.OrdinalIgnoreCase);
            var order      = new List <IValueProcessor>();

            // Auto determine.
            Add(new BoolProcessor(context));
            Add(new IntProcessor(context));
            Add(new LongProcessor(context));
            Add(new ULongProcessor(context));
            Add(new DoubleProcessor(context));
            Add(new DurationProcessor(context));
            Add(new DateTimeProcessor(context));
            Add(new DateTimeOffsetProcessor(context));
            Add(new StringProcessor(context));
            Add(new ObjectProcessor(context));

            // Need to specify type to use.
            Add(new ByteProcessor(context));
            Add(new CharProcessor(context));
            Add(new SByteProcessor(context));
            Add(new UIntProcessor(context));
            Add(new ShortProcessor(context));
            Add(new UShortProcessor(context));
            Add(new FloatProcessor(context));
            Add(new DecimalProcessor(context));
            Add(new TimeSpanProcessor(context));

            SetValueProcessorLookup(context, lookup);
            SetValueProcessorLookup(context, typeLookup);
            SetValueProcessorOrder(context, order);

            void Add(IValueProcessor processor)
            {
                typeLookup.Add(processor.DataType, processor);
                processor.DataTypeNames.ForEach(n => lookup.Add(n, processor));
                order.Add(processor);
            }
        }
 private static Dictionary <Type, IValueProcessor> GetValueProcessorTypeLookup(this SpecFlowContext context)
 => context.GetEx <Dictionary <Type, IValueProcessor> >("__processorTypeLookup__");
 private static Dictionary <string, CollectionProcessorFactory> GetCollectionProcessorFactoryLookup(
     this SpecFlowContext context)
 => context.GetEx <Dictionary <string, CollectionProcessorFactory> >("__collectionProcessorLookup__");