public override void Execute(DTObject dto)
        {
            var entities = dto.FindEntities(_findExp, false);

            foreach (var e in entities)
            {
                e.Name = _name;
            }
            //dto.OrderEntities();
        }
        private void RemoveEntities(DTObject dto, string findExp)
        {
            var targets = dto.FindEntities(findExp, false);

            foreach (var target in targets)
            {
                var parent = target.Parent;
                if (parent == null)
                {
                    throw new DTOException("预期之外的错误," + findExp);
                }
                parent.DeletEntity(target);
            }
        }
Пример #3
0
        private void RetainEntities(DTObject dto, string[] findExps)
        {
            if (findExps.Length == 0)
            {
                return;
            }

            //收集需要保留的实体
            var targets = new List <ReservedInfo>();

            foreach (var findExp in findExps)
            {
                var items = dto.FindEntities(findExp, false);
                foreach (var item in items)
                {
                    targets.Add(new ReservedInfo(item, true));
                    //加入自身
                    //再加入父亲,由于自身需要保留,所以父亲也得保留
                    var parent = item.Parent;
                    while (parent != null)
                    {
                        targets.Add(new ReservedInfo(parent, false));
                        parent = parent.Parent;
                    }
                }
            }
            targets = targets.Distinct().ToList(); //过滤重复

            var removes = new List <DTEntity>();

            CollectNeedRemove(dto.GetRoot().GetEntities(), targets, removes);

            foreach (var t in removes)
            {
                var parent = t.Parent;
                if (parent == null)
                {
                    throw new DTOException("预期之外的错误," + string.Join(";", findExps));
                }
                parent.DeletEntity(t);
            }
        }
Пример #4
0
        /// <summary>
        /// 该方法用于更改成员的值
        /// </summary>
        /// <param name="dto"></param>
        /// <param name="findExp"></param>
        /// <param name="valueFindExp"></param>
        /// <param name="transformValue"></param>
        public void ChangeValue(DTObject dto, string findExp, string valueFindExp, Func <object, object> transformValue)
        {
            ArgumentAssert.IsNotNullOrEmpty(findExp, "findExp");
            ArgumentAssert.IsNotNullOrEmpty(valueFindExp, "valueFindExp");

            //1.找出需要赋值的目标成员
            var targets = dto.FindEntities(findExp, false);

            if (targets.Length == 0)
            {
                dto.SetValue(findExp, string.Empty);                      //如果没有成员,就自动生成
            }
            targets = dto.FindEntities(findExp, false);


            var valueExpression = _getValueExpression(valueFindExp);

            foreach (var target in targets)
            {
                var parent = target.Parent as DTEObject;
                if (parent == null)
                {
                    throw new DTOException("预期之外的错误," + valueExpression.FindExp);
                }

                var parentDTO = valueExpression.StartRoot ? dto : DTOPool.CreateObject(parent, dto.IsReadOnly, dto.IsPinned);

                //2.找出值,值是在目标成员所在的对象下进行查找的
                var entities = parentDTO.FindEntities(valueExpression.FindExp, false);
                if (entities.Length == 1)
                {
                    //获取值
                    var ve       = entities[0];
                    var newValue = GetValue(ve, transformValue, dto.IsReadOnly);
                    if (newValue == null)
                    {
                        throw new DTOException("预期之外的数据转换," + valueExpression.FindExp);
                    }


                    //目标值是唯一的,这个时候要进一步判断
                    var valueObjParent = ve.Parent.Parent as DTEList;         //这是值所在的对象的父亲
                    //if (valueObjFather != null && ve!=target)  //如果值所在的对象处在集合中,并且不是自身对自身赋值,那么还是要以集合形式赋值
                    if (valueObjParent != null && ve.Parent != target.Parent) //如果值所在的对象处在集合中,并且不是自身对象对自身对象赋值,那么还是要以集合形式赋值
                    {
                        //以集合赋值
                        SetValue(target, new object[] { newValue }, valueExpression.FindExp);
                    }
                    else
                    {
                        //赋单值
                        SetValue(target, newValue, valueExpression.FindExp);
                    }
                }
                else if (entities.Length > 1)
                {
                    //如果目标值是多个,那么是集合类型,这时候需要收集所有转换后的值,再赋值
                    List <object> values = new List <object>(entities.Length);
                    foreach (var e in entities)
                    {
                        var newValue = GetValue(e, transformValue, dto.IsReadOnly);
                        if (newValue == null)
                        {
                            throw new DTOException("预期之外的数据转换," + valueExpression.FindExp);
                        }
                        values.Add(newValue);
                    }

                    SetValue(target, values, valueExpression.FindExp);
                }
                else
                {
                    //值为0,需要判断是否为数组
                }
            }
        }