예제 #1
0
        private void SetValue(DTEntity target, object value, string findExp)
        {
            var parent = target.Parent as DTEObject;

            if (parent == null)
            {
                throw new DTOException("表达式错误" + findExp);
            }

            var query = QueryExpression.Create(target.Name);

            parent.SetEntity(query, (name) =>
            {
                var dtoValue = value as DTObject;
                if (dtoValue != null)
                {
                    var t          = dtoValue.Clone();
                    var newEntity  = t.GetRoot();
                    newEntity.Name = name;
                    return(newEntity);
                }
                else
                {
                    DTObject t = DTObject.CreateReusable();
                    t.SetValue(value);
                    var newEntity = t.GetRoot().GetFirstEntity();
                    if (newEntity == null)
                    {
                        throw new DTOException("预期之外的错误," + findExp);
                    }
                    newEntity.Name = name;
                    return(newEntity);
                }
            });
        }
예제 #2
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,需要判断是否为数组
                }
            }
        }
예제 #3
0
 public void Write(string name, DateTime value)
 {
     _dto.SetValue(name, value);
 }