private void AddField(FieldProviderAttribute field)
        {
            var fieldName = field.Name.ToLower();

            if (fieldNames.ContainsKey(fieldName))
            {
                throw new InvalidOperationException($"Field by name {field.Name} already exists.");
            }

            var fieldIndex = fields.Count;

            fieldNames.Add(fieldName, fieldIndex);
            fields.Add(field);
        }
        private void InitializeField(FieldProviderAttribute field, MemberInfo fieldMember)
        {
            IModelBinding modelBinding;

            switch (fieldMember.MemberType)
            {
            case MemberTypes.Field:
                modelBinding = new FieldModelBinding((FieldInfo)fieldMember);
                break;

            case MemberTypes.Property:
                modelBinding = new PropertyModelBinding((PropertyInfo)fieldMember);
                break;

            default:
                throw new InvalidOperationException();
            }

            field.Initialize(this, modelBinding);

            AddField(field);
        }