/// <summary> /// 获取匹配成员方法集合 /// </summary> /// <typeparam name="attributeType">自定义属性类型</typeparam> /// <param name="type">类型</param> /// <param name="methods">成员方法集合</param> /// <param name="isAttribute">是否匹配自定义属性类型</param> /// <param name="isBaseType">指定是否搜索该成员的继承链以查找这些特性,参考System.Reflection.MemberInfo.GetCustomAttributes(bool inherit)。</param> /// <returns>匹配成员方法集合</returns> private static MethodIndex[] getMethods <attributeType> (Type type, LeftArray <MethodIndex> methods, bool isAttribute, bool isBaseType) where attributeType : IgnoreMemberAttribute { if (isAttribute) { return(methods.GetFindArray(value => value.IsAttribute <attributeType>(isBaseType))); } else { return(methods.GetFindArray(value => value.Method.DeclaringType == type && !value.IsIgnoreAttribute <attributeType>(isBaseType))); } }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { Type modelType; AutoCSer.Sql.ModelAttribute modelAttribute = Type.Type.customAttribute <AutoCSer.Sql.ModelAttribute>(out modelType); if (modelAttribute != null) { AutoCSer.Net.TcpStaticServer.ServerAttribute serverAttribute = AutoCSer.Metadata.TypeAttribute.GetAttribute <AutoCSer.Net.TcpStaticServer.ServerAttribute>(Type, false); if (serverAttribute != null && serverAttribute.ServerName != null && !serverAttribute.IsRemoteLinkType && serverAttribute.IsRemoteLink && (RemoteLinkType = TcpStaticServer.Generator.GetRemoteLinkType(Type)) != null) { LeftArray <TcpStaticServer.Generator.RemoteMethod> remoteMethods = new LeftArray <TcpStaticServer.Generator.RemoteMethod>(0); foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, serverAttribute.GetMemberFilters, false, serverAttribute.IsAttribute, serverAttribute.IsBaseTypeAttribute)) { if (!method.Method.IsGenericMethodDefinition) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = method.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null && !remoteAttribute.IsClientRemoteMember) { MethodParameter[] parameters = method.Parameters; if (parameters.Length >= 1 && parameters[0].ParameterType == RemoteLinkType.ParameterType) { remoteMethods.Add(new TcpStaticServer.Generator.RemoteMethod { Type = Type, Method = method, MethodParameters = parameters, Attribute = remoteAttribute }); } } } } LeftArray <SqlModel.Generator.LogMember> logMembers = new LeftArray <SqlModel.Generator.LogMember>(0); foreach (MemberIndex member in MemberIndex.GetMembers(modelType, modelAttribute.MemberFilters)) { if (!member.IsIgnore) { AutoCSer.Sql.MemberAttribute attribute = member.GetAttribute <AutoCSer.Sql.MemberAttribute>(false); if (modelAttribute.LogServerName != null) { AutoCSer.Sql.LogAttribute logAttribute = member.GetAttribute <AutoCSer.Sql.LogAttribute>(false); if (logAttribute != null) { SqlModel.Generator.LogMember logMember = new SqlModel.Generator.LogMember { Member = member, Attribute = logAttribute, MemberAttribute = attribute }; if (modelAttribute.LogServerName != null && logMember.IsProxy) { logMembers.Add(logMember); foreach (TcpStaticServer.Generator.RemoteMethod remoteMethod in remoteMethods) { if (remoteMethod.Attribute.MemberName == member.MemberName) { remoteMethod.Member = member; break; } } } } } } } RemoteMethods = remoteMethods.GetFindArray(value => value.Member != null); LogMembers = logMembers.Length != 0 && (modelAttribute.CacheType != AutoCSer.Sql.Cache.Whole.Event.Type.Unknown && modelAttribute.CacheType != AutoCSer.Sql.Cache.Whole.Event.Type.CreateMemberKey) ? logMembers.ToArray() : EmptyArray <SqlModel.Generator.LogMember> .Array; if ((LogMembers.Length | RemoteMethods.Length) != 0) { //create(true); IsRemoteMember = RemoteMethods.Length != 0 && TcpStaticServer.Generator.RemoteMemberTypes.Add(Type); CSharpTypeDefinition definition = new CSharpTypeDefinition(Type, true, false); _code_.Length = 0; create(false); Coder.Add(definition.Start + _partCodes_["SERVER"] + definition.End); TcpStaticServer.Generator.AddClientCode(new TcpStaticServer.Generator.ClientCode { Type = Type, Attribute = serverAttribute, Code = definition.Start + _partCodes_["CLIENT"] + definition.End, SegmentationCode = definition.Start + _partCodes_["CLIENTCALL"] + definition.End }); } } } }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { MemberIndex identity = Identity = null; int isIdentityCase = SqlStreamTypeCount = NowTimeArraySize = 0; LeftArray <MemberIndex> members = default(LeftArray <MemberIndex>), primaryKeys = default(LeftArray <MemberIndex>), indexMembers = default(LeftArray <MemberIndex>); LeftArray <CountMember> counterMembers = default(LeftArray <CountMember>); LeftArray <MemberIndex> nowTimeMembers = default(LeftArray <MemberIndex>); LeftArray <LogMember> logMembers = new LeftArray <LogMember>(); LeftArray <string> strings = default(LeftArray <string>); IsLogProxyMember = false; foreach (MemberIndex member in MemberIndex.GetMembers(Type, Attribute.MemberFilters)) { if (!member.IsIgnore) { AutoCSer.Sql.MemberAttribute attribute = member.GetAttribute <AutoCSer.Sql.MemberAttribute>(false); bool isMember = attribute == null || attribute.IsSetup; if (Attribute.LogServerName != null) { AutoCSer.Sql.LogAttribute logAttribute = member.GetAttribute <AutoCSer.Sql.LogAttribute>(false); if (logAttribute != null) { LogMember logMember = new LogMember { Member = member, Attribute = logAttribute, MemberAttribute = attribute }; logMembers.Add(logMember); if (logMember.IsProxy) { IsLogProxyMember = true; } if (!logAttribute.IsMember) { isMember = false; } } } if (isMember) { members.Add(member); if (attribute != null) { if (attribute.IsMemberIndex) { indexMembers.Add(member); } if (attribute.IsNowTime && member.MemberSystemType == typeof(DateTime)) { nowTimeMembers.Add(member); if (member.MemberIndex >= NowTimeArraySize) { NowTimeArraySize = member.MemberIndex + 1; } } if (attribute.PrimaryKeyIndex != 0) { primaryKeys.Add(member); } if (attribute.IsIdentity) { Identity = member; } } if (Identity == null) { if (isIdentityCase == 0 && member.MemberName == AutoCSer.Sql.Field.IdentityName) { identity = member; isIdentityCase = 1; } else if (identity == null && member.MemberName.Length == AutoCSer.Sql.Field.IdentityName.Length && member.MemberName.ToLower() == AutoCSer.Sql.Field.IdentityName) { identity = member; } } AutoCSer.Sql.CountAttribute countAttribute = member.GetAttribute <AutoCSer.Sql.CountAttribute>(false); if (countAttribute != null) { counterMembers.Add(new CountMember { Member = member, Attribute = countAttribute }); } if (member.MemberSystemType == typeof(string) && (attribute == null || (attribute.MaxStringLength == 0 && !attribute.IsIgnoreMaxStringLength))) { strings.Add(member.MemberName); } } } } if (Identity == null) { Identity = identity; } if (Attribute.LogServerName == null) { LogMembers = NullValue <LogMember> .Array; } else { LogMembers = logMembers.ToArray(); if (!Attribute.IsDefaultSerialize && Attribute.IsLogMemberMap) { AutoCSer.BinarySerialize.SerializeAttribute dataSerialize = Type.Type.customAttribute <AutoCSer.BinarySerialize.SerializeAttribute>(); if (dataSerialize != null && !dataSerialize.IsMemberMap) { Messages.Message("数据库日志流处理类型 " + Type.FullName + " 序列化不支持成员位图"); } } foreach (LogMember member in LogMembers) { if (member.Attribute.CountType != null) { ++SqlStreamTypeCount; } } } CounterMembers = counterMembers.ToArray(); NowTimeMembers = nowTimeMembers.ToArray(); if (strings.Length != 0) { Messages.Message(Type.FullName + " 字符串字段缺少最大长度限制 " + string.Join(",", strings.ToArray())); } WebPaths.Length = 0; ListArray <WebPathType> types; if (webPathTypes == null) { webPathTypes = new Dictionary <Type, ListArray <WebPathType> >(); foreach (Type nextType in AutoParameter.Types) { AutoCSer.WebView.PathAttribute webPath = nextType.customAttribute <AutoCSer.WebView.PathAttribute>(); if (webPath != null && webPath.Type != null && webPath.MemberName != null) { FieldInfo[] fields = nextType.GetFields(BindingFlags.Instance | BindingFlags.Public); if (fields.Length != 0) { if (!webPathTypes.TryGetValue(webPath.Type, out types)) { webPathTypes.Add(webPath.Type, types = new ListArray <WebPathType>()); } int memberIndex = fields.Length; types.Add(new WebPathType { MemberType = nextType, Attribute = webPath, Members = fields.getArray(value => new MemberIndex(value, --memberIndex)) }); } } } } if (webPathTypes.TryGetValue(Type, out types)) { foreach (WebPathType webPath in types) { MemberIndex[] fields = webPath.CheckMembers(ref members); if (fields != null) { WebPaths.Add(new WebPathType { MemberType = webPath.MemberType, Attribute = webPath.Attribute, Members = fields }); } } } dataPrimaryKey.Run(Type, PrimaryKeys = primaryKeys.ToArray()); if (Attribute.IsUpdateMemberMap) { if (Identity == null) { UpdateMembers = members.GetFindArray(value => Array.IndexOf(PrimaryKeys, value) < 0); } else { UpdateMembers = members.GetFindArray(value => value != Identity); } if (indexMembers.Length != 0) { indexMembers.Remove(value => Array.IndexOf(UpdateMembers, value) >= 0); } if (indexMembers.Length == 0) { indexMembers.Set(UpdateMembers); } else { indexMembers.Add(UpdateMembers); } } else { UpdateMembers = NullValue <MemberIndex> .Array; } IndexMembers = indexMembers.ToArray(); create(true); }