示例#1
0
        private void SaveProperty(string name, object value, object comObject, Stack <object> pending, Metadata metadata)
        {
            var list = value as IList;

            if (list != null)
            {
                var tableSection = ComHelpers.GetProperty(comObject, name);
                ComHelpers.Invoke(tableSection, "Очистить");
                foreach (Abstract1CEntity item in (IList)value)
                {
                    Save(item, ComHelpers.Invoke(tableSection, "Добавить"), pending);
                }
                return;
            }
            var syncList = value as SyncList;

            if (syncList != null)
            {
                var tableSection = ComHelpers.GetProperty(comObject, name);
                foreach (var cmd in syncList.Commands)
                {
                    switch (cmd.CommandType)
                    {
                    case SyncList.CommandType.Delete:
                        var deleteCommand = (SyncList.DeleteCommand)cmd;
                        ComHelpers.Invoke(tableSection, "Удалить", deleteCommand.index);
                        break;

                    case SyncList.CommandType.Insert:
                        var insertCommand    = (SyncList.InsertCommand)cmd;
                        var newItemComObject = ComHelpers.Invoke(tableSection, "Вставить", insertCommand.index);
                        pending.Push(insertCommand.index);
                        Save(insertCommand.item, newItemComObject, pending);
                        pending.Pop();
                        break;

                    case SyncList.CommandType.Move:
                        var moveCommand = (SyncList.MoveCommand)cmd;
                        ComHelpers.Invoke(tableSection, "Сдвинуть", moveCommand.from, moveCommand.delta);
                        break;

                    case SyncList.CommandType.Update:
                        var updateCommand = (SyncList.UpdateCommand)cmd;
                        pending.Push(updateCommand.index);
                        Save(updateCommand.item, Call.Получить(tableSection, updateCommand.index), pending);
                        pending.Pop();
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                return;
            }
            object valueToSet;
            var    abstractEntity = value as Abstract1CEntity;

            if (abstractEntity != null)
            {
                Save(abstractEntity, null, pending);
                valueToSet = abstractEntity.Controller.ValueSource.GetBackingStorage();
            }
            else
            {
                if (metadata != null && value != null)
                {
                    metadata.Validate(name, value);
                }
                valueToSet = comObjectMapper.MapTo1C(value);
            }
            ComHelpers.SetProperty(comObject, name, valueToSet);
        }