Exemple #1
0
            /// <summary>
            /// 根据成员名称获取子节点成员
            /// </summary>
            /// <param name="name">成员名称</param>
            /// <param name="isLast">是否最后层级</param>
            /// <returns>子节点成员</returns>
            public memberNode Get(ref string name, bool isLast)
            {
                Dictionary <string, memberNode> paths;

                if (!Template.memberPaths.TryGetValue(this, out paths))
                {
                    Template.memberPaths[this] = paths = new Dictionary <string, memberNode>();
                }
                memberNode value;

                if (isLast && Template.isCollectionLength && name == "length")
                {
                    if (Type.Type.IsArray)
                    {
                        name = "Length";
                    }
                    else if (Type.Type.isInterface(typeof(ICollection)))
                    {
                        name = "Count";
                    }
                }
                if (paths.TryGetValue(name, out value))
                {
                    return(value);
                }
                if (name.Length != 0)
                {
                    memberIndex member;
                    if (Members.TryGetValue(name, out member))
                    {
                        //keyValue<memberIndex, string> propertyIndex;
                        //if (Template.currentMembers.Unsafer.Array[0] == this
                        //    && !Template.propertyNames.TryGetValue(name, out propertyIndex))
                        //{
                        //    Template.propertyNames.Add(name, new keyValue<memberIndex, string>(member, "_p" + Template.propertyNames.Count.toString()));
                        //}
                        //else propertyIndex.Value = name;
                        //, IsLadyProperty = !member.IsField && member.Member.customAttribute<ladyProperty>(false, false) != null
                        value = new memberNode {
                            Type = member.Type, Name = name
                        };
                    }
                }
                else
                {
                    value = new memberNode {
                        Type = Type.EnumerableArgumentType
                    }
                };
                if (value != null)
                {
                    value.Parent   = this;
                    value.Template = Template;
                    paths[name]    = value;
                }
                return(value);
            }
Exemple #2
0
        /// <summary>
        /// 根据成员名称获取成员树节点
        /// </summary>
        /// <param name="memberName">成员名称</param>
        /// <param name="isDepth">是否深度搜索,false表示当前节点子节点</param>
        /// <returns>成员树节点</returns>
        protected memberNode getMember(string memberName, out bool isDepth)
        {
            int memberIndex = 0;

            while (memberIndex != memberName.Length && memberName[memberIndex] == '.')
            {
                ++memberIndex;
            }
            memberName  = memberName.Substring(memberIndex);
            memberIndex = currentMembers.Count - memberIndex - 1;
            if (memberIndex < 0)
            {
                memberIndex = 0;
            }
            memberNode value = currentMembers[memberIndex];

            isDepth = false;
            if (memberName.Length != 0)
            {
                string[] names = memberName.Split('.');
                for (; memberIndex >= 0; --memberIndex)
                {
                    if ((value = currentMembers[memberIndex].Get(names[0])) != null)
                    {
                        value.Path = memberIndex == 0 ? names[0] : (path(memberIndex) + "." + names[0]);
                        for (int nameIndex = 1; nameIndex != names.Length; ++nameIndex)
                        {
                            isDepth = true;
                            if ((value = value.Get(names[nameIndex])) == null)
                            {
                                break;
                            }
                            value.Path = value.Parent.Path + "." + names[nameIndex];
                        }
                        if (value == null)
                        {
                            break;
                        }
                        else
                        {
                            return(value);
                        }
                    }
                }
                error.Add(viewType.fullName() + " 未找到属性 " + currentMembers.lastOrDefault().FullPath + " . " + memberName);
            }
            return(value);
        }
Exemple #3
0
        /// <summary>
        /// if开始代码段
        /// </summary>
        /// <param name="memberName">成员名称</param>
        /// <param name="isSkip">是否跳跃层次</param>
        protected void ifStart(string memberName, bool isSkip)
        {
            bool       isDepth;
            memberNode member = getMember(memberName, out isDepth);

            pushMember(member);
            if (isSkip)
            {
                pushMember(member);
            }
            string name = path(0);

            code.Append(@"
                {
                    ", member.Type.FullName, " ", name, " = ", member.Path, ";");
            ifStart(member.Type, name, null);
        }
Exemple #4
0
 /// <summary>
 /// 输出绑定的数据
 /// </summary>
 /// <param name="member">成员节点</param>
 protected void at(memberNode member)
 {
     pushCode(null);
     if (member.Type.IsString)
     {
         code.Append(@"
     _code_.Add(", member.Path, ");");
     }
     else if (member.Type.IsBool && member.Type.IsStruct)
     {
         code.Append(@"
     _code_.Add(", member.Path, @" ? ""true"" : ""false"");");
     }
     else
     {
         code.Append(@"
     _code_.Add(", member.Path, ".ToString());");
     }
 }
Exemple #5
0
 /// <summary>
 /// if代码段处理
 /// </summary>
 /// <param name="member">成员节点</param>
 /// <param name="memberName">成员名称</param>
 /// <param name="isDepth">是否深度搜索</param>
 /// <param name="doMember">成员处理函数</param>
 protected void ifThen(memberNode member, string memberName, bool isDepth, action <memberNode> doMember)
 {
     if (isDepth)
     {
         pushCode(null);
         subString[] names = splitMemberName(memberName);
         for (int index = 0; index != names.Length - 1; ++index)
         {
             ifStart(names[index], false);
         }
         doMember(getMember(names[names.Length - 1], out isDepth));
         pushCode(null);
         for (int index = 0; index != names.Length - 1; ++index)
         {
             ifEnd(true);
         }
     }
     else
     {
         doMember(member);
     }
 }
Exemple #6
0
            /// <summary>
            /// 根据成员名称获取子节点成员
            /// </summary>
            /// <param name="name">成员名称</param>
            /// <returns>子节点成员</returns>
            public memberNode Get(string name)
            {
                Dictionary <string, memberNode> paths;

                if (!Template.memberPaths.TryGetValue(this, out paths))
                {
                    Template.memberPaths[this] = paths = new Dictionary <string, memberNode>();
                }
                memberNode value;

                if (paths.TryGetValue(name, out value))
                {
                    return(value);
                }
                if (name.Length != 0)
                {
                    memberInfo member;
                    if (Members.TryGetValue(name, out member))
                    {
                        value = new memberNode {
                            Type = member.MemberType, Name = name
                        }
                    }
                    ;
                }
                else
                {
                    value = new memberNode {
                        Type = Type.EnumerableArgumentType
                    }
                };
                if (value != null)
                {
                    value.Parent   = this;
                    value.Template = Template;
                    paths[name]    = value;
                }
                return(value);
            }
Exemple #7
0
 /// <summary>
 /// 添加当前成员节点
 /// </summary>
 /// <param name="member">成员节点</param>
 protected void pushMember(memberNode member)
 {
     currentMembers.Add(member);
 }
Exemple #8
0
        /// <summary>
        /// 根据成员名称获取成员树节点
        /// </summary>
        /// <param name="memberName">成员名称</param>
        /// <param name="isDepth">是否深度搜索,false表示当前节点子节点</param>
        /// <returns>成员树节点</returns>
        protected memberNode getMember(string memberName, out bool isDepth)
        {
            int memberIndex = 0;

            while (memberIndex != memberName.Length && memberName[memberIndex] == '.')
            {
                ++memberIndex;
            }
            memberName  = memberName.Substring(memberIndex);
            memberIndex = currentMembers.Count - memberIndex - 1;
            if (memberIndex < 0)
            {
                memberIndex = 0;
            }
            memberNode value = currentMembers[memberIndex];

            isDepth = false;
            if (memberName.Length != 0)
            {
                string[] names = memberName.Split('.');
                for (int lastIndex = names.Length - 1; memberIndex >= 0; --memberIndex)
                {
                    if ((value = currentMembers[memberIndex].Get(ref names[0], lastIndex == 0)) != null)
                    {
                        if (memberIndex == 0)
                        {
                            //keyValue<memberIndex, string> propertyIndex;
                            //if (!propertyNames.TryGetValue(names[0], out propertyIndex)) propertyIndex.Value = names[0];
                            //value.Path = propertyIndex.Value;
                            value.Path = names[0];
                        }
                        else
                        {
                            value.Path = path(memberIndex) + "." + names[0];
                        }
                        if (names.Length != 1)
                        {
                            isDepth = true;
                        }
                        for (int nameIndex = 1; nameIndex != names.Length; ++nameIndex)
                        {
                            if ((value = value.Get(ref names[nameIndex], nameIndex == lastIndex)) == null)
                            {
                                break;
                            }
                            value.Path = value.Parent.Path + "." + names[nameIndex];
                        }
                        if (value == null)
                        {
                            break;
                        }
                        else
                        {
                            return(value);
                        }
                    }
                }
                string message = viewType.fullName() + " 未找到属性 " + currentMembers.lastOrDefault().FullPath + " . " + memberName;
                if (checkErrorMemberName(memberName))
                {
                    error.Message(message);
                    return(null);
                }
#if MONO
                log.Default.Real(message, false, false);
#else
                error.Add(message);
#endif
            }
            return(value);
        }