Beispiel #1
0
        private object GetValue(DTEntity e, Func <object, object> transformValue, bool isReadOnly)
        {
            var ve = e as DTEValue;

            if (ve != null)
            {
                return(transformValue(ve.Value));
            }

            var le = e as DTEList;

            if (le != null)
            {
                var list  = le.GetObjects();
                var value = list.Select((item) =>
                {
                    if (item.IsSingleValue)
                    {
                        return(item.GetValue());
                    }
                    return(item);
                }).ToArray();
                return(transformValue(value));
            }

            var oe = e as DTEObject;

            if (oe != null)
            {
                var value = DTOPool.CreateObject(oe, isReadOnly, oe.IsPinned);
                return(transformValue(value));
            }
            return(null);
        }
        public DTObject GetObject(string findExp, DTObject defaultValue)
        {
            var entity = this.FindEntity <DTEObject>(findExp, false);

            if (entity == null)
            {
                return(defaultValue);
            }
            return(DTOPool.CreateObject(entity, this.IsReadOnly, this.IsPinned));
        }
        public DTObject GetObject(string findExp, bool throwError)
        {
            var entity = this.FindEntity <DTEObject>(findExp, throwError);

            if (entity == null)
            {
                return(null);
            }
            return(DTOPool.CreateObject(entity, this.IsReadOnly, this.IsPinned));
        }
Beispiel #4
0
        private static DTObject CreateDTObject(DTEntity root, bool isReadOnly, bool isPinned)
        {
            var o = root as DTEObject;
            if (o != null) return DTOPool.CreateObject(o, isReadOnly, isPinned);

            var members = DTOPool.CreateDTEntities(isPinned);
            members.Add(root);

            o = DTOPool.CreateDTEObject(members, isPinned);
            return DTOPool.CreateObject(o, isReadOnly, isPinned);
        }
        public object GetValue(string findExp, bool throwError)
        {
            DTEntity entity = FindEntity(findExp, throwError);

            if (entity == null)
            {
                return(null);
            }
            switch (entity.Type)
            {
            case DTEntityType.Value:
            {
                var ev = entity as DTEValue;
                if (ev != null)
                {
                    return(ev.Value);
                }
            }
            break;

            case DTEntityType.Object:
            {
                var eo = entity as DTEObject;
                if (eo != null)
                {
                    return(DTOPool.CreateObject(eo, this.IsReadOnly, this.IsPinned));
                }
            }
            break;

            case DTEntityType.List:
            {
                var el = entity as DTEList;
                if (el != null)
                {
                    return(el.GetObjects());
                }
            }
            break;
            }
            return(null);
        }
        //public Dictionary<string, T> GetDictionary<T>()
        //{
        //    return GetDictionary<T>(string.Empty, false);
        //}

        //public Dictionary<string, T> GetDictionary<T>(string findExp)
        //{
        //    return GetDictionary<T>(findExp, false);
        //}

        ///// <summary>
        ///// 本质上来说,json就是一组键值对,因此可以获取键值对形式的值
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="findExp"></param>
        ///// <param name="throwError"></param>
        ///// <returns></returns>
        //public Dictionary<string, T> GetDictionary<T>(string findExp, bool throwError)
        //{
        //    var entities = this.FindEntities(findExp, throwError);
        //    var dictionary = new Dictionary<string, T>(entities.Length);
        //    foreach (var entity in entities)
        //    {
        //        var key = entity.Name;
        //        var value = CreateEntityValue(entity);
        //        if (value is T)
        //            dictionary.Add(key, (T)value);
        //    }
        //    return dictionary;
        //}

        private object CreateEntityValue(DTEntity entity)
        {
            switch (entity.Type)
            {
            case DTEntityType.Value:
            {
                var temp = entity as DTEValue;
                if (temp != null)
                {
                    return(temp.Value);
                }
            }
            break;

            case DTEntityType.Object:
            {
                var temp = entity as DTEObject;
                if (temp != null)
                {
                    return(DTOPool.CreateObject(temp, this.IsReadOnly, this.IsPinned));
                }
            }
            break;

            case DTEntityType.List:
            {
                var temp = entity as DTEList;
                if (temp != null)
                {
                    return(temp.GetObjects());
                }
            }
            break;
            }
            throw new DTOException("在CreateEntityValue发生未知的错误,entity类型为" + entity.GetType());
        }
Beispiel #7
0
        private object GetValue(DTEntity entity)
        {
            switch (entity.Type)
            {
            case DTEntityType.Value:
            {
                var ev = entity as DTEValue;
                if (ev != null)
                {
                    return(ev.Value);
                }
            }
            break;

            case DTEntityType.Object:
            {
                var eo = entity as DTEObject;
                if (eo != null)
                {
                    return(DTOPool.CreateObject(eo, this.IsReadOnly, this.IsPinned));
                }
            }
            break;

            case DTEntityType.List:
            {
                var el = entity as DTEList;
                if (el != null)
                {
                    return(el.GetObjects());
                }
            }
            break;
            }
            return(null);
        }
Beispiel #8
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,需要判断是否为数组
                }
            }
        }
        /// <summary>
        /// 完整的创建方法
        /// </summary>
        /// <param name="code"></param>
        /// <param name="isReadOnly"></param>
        /// <param name="isPinned"></param>
        /// <returns></returns>
        private static DTObject CreateComplete(string code, bool isReadOnly, bool isPinned)
        {
            var root = EntityDeserializer.Deserialize(code, isReadOnly, isPinned);

            return(DTOPool.CreateObject(root, isReadOnly, isPinned));
        }
 public DTObject Clone()
 {
     return(DTOPool.CreateObject(_root.Clone() as DTEObject, this.IsReadOnly, this.IsPinned));
 }