/// <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); }