/// <summary>
 ///     根据成员名称获取子节点成员
 /// </summary>
 /// <param name="name">成员名称</param>
 /// <param name="isLast">是否最后层级</param>
 /// <returns>子节点成员</returns>
 internal TmphMemberNode Get(ref string name, bool isLast)
 {
     Dictionary<TmphHashString, TmphMemberNode> paths;
     if (!_template.MemberPaths.TryGetValue(this, out paths))
     {
         _template.MemberPaths[this] = paths = TmphDictionary.CreateHashString<TmphMemberNode>();
     }
     TmphMemberNode value;
     if (isLast && _template.IsCollectionLength && name == "length")
     {
         if (Type.Type.IsArray) name = "Length";
         else if (typeof(ICollection).IsAssignableFrom(Type.Type)) name = "Count";
     }
     if (paths.TryGetValue(name, out value)) return value;
     var isPath = true;
     if (name.Length != 0)
     {
         TmphMemberIndex member;
         if (Members.TryGetValue(name, out member))
         {
             //if (member.Member.customAttribute<Laurent.Lee.CLB.Code.ignore>(true) != null) isPath = false;
             if (member.IsIgnore) isPath = false;
             var outputAjax = member.GetAttribute<TmphWebView.TmphOutputAjax>(true, true);
             if (outputAjax != null)
             {
                 if (outputAjax.BindingName != null)
                 {
                     var outputName = outputAjax.BindingName;
                     value = Get(ref outputName, false);
                 }
                 if (!outputAjax.IsSetup) isPath = false;
             }
             value = new TmphMemberNode(_template, member.Type, name, null);
             //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
         }
     }
     else value = new TmphMemberNode(_template, Type.EnumerableArgumentType, null, null);
     if (value != null)
     {
         value.Parent = this;
         //value.template = template;
         if (isPath) paths[name] = value;
     }
     return value;
 }
 /// <summary>
 ///     if代码段处理
 /// </summary>
 /// <param name="member">成员节点</param>
 /// <param name="memberName">成员名称</param>
 /// <param name="isDepth">是否深度搜索</param>
 /// <param name="doMember">成员处理函数</param>
 protected void IfThen(TmphMemberNode member, string memberName, bool isDepth, Action<TmphMemberNode> doMember)
 {
     if (isDepth)
     {
         PushCode(null);
         var names = SplitMemberName(memberName);
         for (var index = 0; index != names.Length - 1; ++index) IfStart(names[index], false);
         doMember(GetMember(names[names.Length - 1], out isDepth));
         PushCode(null);
         for (var index = 0; index != names.Length - 1; ++index) IfEnd(true);
     }
     else doMember(member);
 }
 /// <summary>
 ///     输出绑定的数据
 /// </summary>
 /// <param name="member">成员节点</param>
 protected void At(TmphMemberNode member)
 {
     PushCode(null);
     if (member.Type.IsString)
     {
         CurrentCode.Append(@"
     _code_.Add(", member.Path, ");");
     }
     else if (member.Type.IsBool && member.Type.IsStruct)
     {
         CurrentCode.Append(@"
     _code_.Add(", member.Path, @" ? ""true"" : ""false"");");
     }
     else
     {
         CurrentCode.Append(@"
     _code_.Add(", member.Path, ".ToString());");
     }
 }
 /// <summary>
 ///     添加当前成员节点
 /// </summary>
 /// <param name="member">成员节点</param>
 protected void PushMember(TmphMemberNode member)
 {
     CurrentMembers.Add(member);
 }