/// <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); }
/// <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); }
/// <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); }
/// <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());"); } }
/// <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); } }
/// <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); }
/// <summary> /// 添加当前成员节点 /// </summary> /// <param name="member">成员节点</param> protected void pushMember(memberNode member) { currentMembers.Add(member); }
/// <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); }