/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { if (!Type.Type.IsInterface) { LeftArray <MemberExpression> members = default(LeftArray <MemberExpression>); nodeTypeNames.Clear(); bool isMember = true; foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Instance, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref members, new MemberExpression { Attribute = attribute, Member = member, IntputParameters = member.IsField ? NullValue <ExpressionParameter> .Array : ExpressionParameter.Get(MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), NullValue <Type> .Array)) }); } } Members = members.ToArray(); LeftArray <MethodExpression> methods = default(LeftArray <MethodExpression>); foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Instance, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref methods, new MethodExpression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } Methods = methods.ToArray(); LeftArray <StaticMemberExpression> staticMembers = default(LeftArray <StaticMemberExpression>); foreach (MemberIndex member in MemberIndex.GetStaticMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Static, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref staticMembers, new StaticMemberExpression { Attribute = attribute, Member = member, IntputParameters = NullValue <ExpressionParameter> .Array }); } } StaticMembers = staticMembers.ToArray(); LeftArray <StaticMethodExpression> staticMethods = default(LeftArray <StaticMethodExpression>); foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.Static, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); isMember &= addMember(ref staticMethods, new StaticMethodExpression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } StaticMethods = staticMethods.ToArray(); if (isMember && (Members.Length | Methods.Length | StaticMemberCount) != 0) { create(true); } } }
/// <summary> /// 设置远程缓存成员集合 /// </summary> protected void setRemoteMemberCache() { LeftArray <RemoteMember> remoteMembers = new LeftArray <RemoteMember>(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Sql.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstanceProperty, true, false)) { if (member.CanGet) { AutoCSer.Sql.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Sql.RemoteMemberAttribute>(false); if (remoteAttribute != null) { if (member.IsField || ((PropertyInfo)member.Member).GetIndexParameters().Length == 0) { remoteMembers.Add(new RemoteMember { Member = member, Attribute = remoteAttribute }); } } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Sql.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Sql.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Sql.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteMember { Method = member, Attribute = remoteAttribute }); } } } RemoteMembers = remoteMembers.ToArray(); RemoteCacheBuilder cacheBuilder = new RemoteCacheBuilder(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Sql.RemoteMemberCacheAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, true, false)) { cacheBuilder.Push(member); } RemoteCaches = cacheBuilder.Caches.ToArray(); }
/// <summary> /// 获取远程调用链类型信息 /// </summary> /// <param name="type"></param> /// <returns></returns> internal static RemoteLinkType GetRemoteLinkType(Type type) { foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteKeyAttribute>(type, MemberFilters.PublicInstance, true, false)) { foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteKeyAttribute>(type, MemberFilters.Static, false, true, false)) { if (!method.Method.IsGenericMethodDefinition && type.IsAssignableFrom(method.Method.ReturnType)) { ParameterInfo[] parameters = method.Method.GetParameters(); if (parameters.Length == 1 && parameters[0].ParameterType == member.MemberSystemType) { return(new RemoteLinkType { Type = type, RemoteKeyMember = member, RemoteKeyMethod = method, ParameterType = member.MemberSystemType }); } } } break; } return(null); }
/// <summary> /// 获取成员集合 /// </summary> /// <param name="type"></param> /// <returns></returns> private static cache getCache(Type type) { cache members; if (!memberCache.TryGetValue(type, out members)) { LeftArray <RemoteLink> remoteMembers = new LeftArray <RemoteLink>(0); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, true, false)) { if (member.CanGet) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteLink { Member = member, PropertyParameters = member.IsField ? EmptyArray <MethodParameter> .Array : MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), EmptyArray <Type> .Array), Attribute = remoteAttribute }); } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteLink { Method = member, Attribute = remoteAttribute }); } } } memberCache.Add(type, members = new cache { Members = remoteMembers.ToArray(), Caches = MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteLinkAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, true, false) }); } return(members); }
/// <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); }
/// <summary> /// 安装下一个类型 /// </summary> protected override void nextCreate() { if ((Attribute.IsAbstract || Type.Type.IsSealed || !Type.Type.IsAbstract) && !Type.Type.IsInterface) { defaultServerName = Attribute.ServerName; defaultServer = null; defaultType = null; if (defaultServerName != null) { HashString nameKey = defaultServerName; if (!servers.TryGetValue(nameKey, out defaultServer)) { servers.Add(nameKey, defaultServer = new Server()); } defaultServer.Attribute.Name = defaultServerName; defaultServer.Types.Add(defaultType = new ServerType { Type = Type, Attribute = Attribute }); if (Attribute.IsServer) { defaultServer.AttributeType = Type; defaultServer.Attribute.CopyFrom(Attribute); } } RemoteLinkType remoteLinkType = null; if (Attribute.ServerName != null) { if (Attribute.IsRemoteLinkType) { remoteLinkType = new RemoteLinkType { Type = Type, ParameterType = Type } } ; else if (Attribute.IsRemoteLink) { remoteLinkType = GetRemoteLinkType(Type); } } LeftArray <RemoteMethod> remoteMethods = new LeftArray <RemoteMethod>(0); foreach (MethodIndex method in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { next(new TcpMethod { Method = method, MethodType = Type }); if (remoteLinkType != null && !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.Type == remoteLinkType.ParameterType) { remoteMethods.Add(new RemoteMethod { Type = Type, Method = method, MethodParameters = parameters, Attribute = remoteAttribute }); } } } } if (remoteLinkType != null) { remoteLinkType.RemoteMethods = remoteMethods.ToArray(); LeftArray <RemoteMember> remoteMembers = new LeftArray <RemoteMember>(0); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstanceProperty, true, false)) { if (member.CanGet) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { if (member.IsField || ((PropertyInfo)member.Member).GetIndexParameters().Length == 0) { remoteMembers.Add(new RemoteMember { Member = member, Attribute = remoteAttribute }); } } } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, false, true, false)) { if (!member.Method.IsGenericMethodDefinition) { AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute remoteAttribute = member.GetSetupAttribute <AutoCSer.Net.TcpStaticServer.RemoteMemberAttribute>(false); if (remoteAttribute != null) { remoteMembers.Add(new RemoteMember { Method = member, Attribute = remoteAttribute }); } } } remoteLinkType.RemoteMembers = remoteMembers.ToArray(); RemoteLinkBuilder cacheBuilder = new RemoteLinkBuilder(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.TcpStaticServer.RemoteLinkAttribute>(Type, AutoCSer.Metadata.MemberFilters.NonPublicInstance, true, false)) { cacheBuilder.Push(member); } remoteLinkType.RemoteLinks = cacheBuilder.Caches.ToArray(); if (remoteLinkType.IsRemoteLink) { defaultServer.RemoteLinkTypes.Add(remoteLinkType); } } if (!Type.Type.IsGenericType) { foreach (MemberIndexInfo member in StaticMemberIndexGroup.Get <AutoCSer.Net.TcpStaticServer.MethodAttribute>(Type, Attribute.GetMemberFilters, false, Attribute.IsAttribute, Attribute.IsBaseTypeAttribute)) { if (member.IsField) { FieldInfo field = (FieldInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, true), MemberIndex = member, MethodType = Type }; if (!getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new Metadata.MethodIndex(field, false), MemberIndex = member, MethodType = Type }; } next(getMethod); if (getMethod.SetMethod != null) { next(getMethod.SetMethod); } } else if (member.CanGet) { PropertyInfo property = (PropertyInfo)member.Member; TcpMethod getMethod = new TcpMethod { Method = new Metadata.MethodIndex(property, true), MemberIndex = member, MethodType = Type }; if (member.CanSet && !getMethod.Attribute.IsOnlyGetMember) { getMethod.SetMethod = new TcpMethod { Method = new Metadata.MethodIndex(property, false), MemberIndex = member, MethodType = Type }; } next(getMethod); if (getMethod.SetMethod != null) { next(getMethod.SetMethod); } } } } serverTypes.Empty(); } }
/// <summary> /// 表达式成员集合 /// </summary> /// <param name="type"></param> /// <param name="memberNodeTypeName"></param> internal ExpressionMemberGroup(ExtensionType type, string memberNodeTypeName) { this.type = type; this.memberNodeTypeName = memberNodeTypeName; LeftArray <Expression> members = new LeftArray <Expression>(0); nodeTypeNames.Clear(); foreach (MemberIndex member in MemberIndex.GetMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); IsMember &= addMember(ref members, new Expression { Attribute = attribute, Member = member, IntputParameters = member.IsField ? EmptyArray <ExpressionParameter> .Array : ExpressionParameter.Get(MethodParameter.Get(((PropertyInfo)member.Member).GetGetMethod(true), EmptyArray <Type> .Array)) }); } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Instance, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); IsMember &= addMember(ref members, new Expression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } Members = members.ToArray(); if (memberNodeTypeName == null) { LeftArray <StaticExpression> staticMembers = new LeftArray <StaticExpression>(0); foreach (MemberIndex member in MemberIndex.GetStaticMembers <AutoCSer.Net.RemoteExpression.MemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Static, true, false)) { if (!member.IsIgnore && member.CanGet) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); IsMember &= addMember(ref staticMembers, new StaticExpression { Attribute = attribute, Member = member, IntputParameters = EmptyArray <ExpressionParameter> .Array }); } } foreach (MethodIndex member in MethodIndex.GetMethods <AutoCSer.Net.RemoteExpression.MemberAttribute>(type, AutoCSer.Metadata.MemberFilters.Static, false, true, false)) { if (!member.IsIgnore) { AutoCSer.Net.RemoteExpression.MemberAttribute attribute = member.GetAttribute <AutoCSer.Net.RemoteExpression.MemberAttribute>(false); IsMember &= addMember(ref staticMembers, new StaticExpression { Attribute = attribute, Method = member, IntputParameters = ExpressionParameter.Get(member.Parameters) }); } } StaticMembers = staticMembers.ToArray(); } else { StaticMembers = EmptyArray <StaticExpression> .Array; } if ((IsMember &= (Members.Length | StaticMembers.Length) != 0) && memberNodeTypeName == null) { foreach (Expression member in Members) { member.CheckGenericMemberGroup(); } foreach (StaticExpression member in StaticMembers) { member.CheckGenericMemberGroup(); } } }