Ejemplo n.º 1
0
            /// <summary>
            /// 动态成员分组
            /// </summary>
            /// <param name="type">目标类型</param>
            /// <param name="isStatic">是否静态成员</param>
            public group(Type type, bool isStatic)
            {
                Dictionary <HashString, typeDepth> members = AutoCSer.DictionaryCreator.CreateHashString <typeDepth>();
                BindingFlags staticFlags = isStatic ? (BindingFlags.Static | BindingFlags.FlattenHierarchy) : BindingFlags.Instance;
                typeDepth    oldMember;

                foreach (FieldInfo field in type.GetFields(BindingFlags.Public | staticFlags))
                {
                    typeDepth  member  = new typeDepth(type, field, true);
                    HashString nameKey = field.Name;
                    if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                    {
                        members[nameKey] = member;
                    }
                }
                int  anonymousCount = 0;
                bool isAnonymous = !isStatic && type.Name[0] == '<', isAnonymousCount = !isStatic && !isAnonymous;

                foreach (FieldInfo field in type.GetFields(BindingFlags.NonPublic | staticFlags))
                {
                    if (field.Name[0] == '<')
                    {
                        if (isAnonymous)
                        {
                            int index = field.Name.IndexOf('>');
                            if (index != -1)
                            {
                                typeDepth  member  = new typeDepth(type, field, false);
                                HashString nameKey = new SubString {
                                    String = field.Name, Start = 1, Length = index - 1
                                };
                                if (!members.TryGetValue(nameKey, out oldMember))
                                {
                                    members[nameKey] = member;
                                }
                            }
                        }
                        else if (isAnonymousCount)
                        {
                            ++anonymousCount;
                        }
                    }
                    else
                    {
                        typeDepth  member  = new typeDepth(type, field, false);
                        HashString nameKey = field.Name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                foreach (PropertyInfo property in type.GetProperties(BindingFlags.Public | staticFlags))
                {
                    if (!members.ContainsKey(property.Name))
                    {
                        typeDepth       member     = new typeDepth(type, property, true);
                        string          name       = property.Name + ".";
                        ParameterInfo[] parameters = property.GetIndexParameters();
                        if (parameters.Length != 0)
                        {
                            name += parameters.joinString(',', value => value.ParameterType.fullName());
                        }
                        HashString nameKey = name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                foreach (PropertyInfo property in type.GetProperties(BindingFlags.NonPublic | staticFlags))
                {
                    if (!members.ContainsKey(property.Name))
                    {
                        typeDepth       member     = new typeDepth(type, property, false);
                        string          name       = property.Name + ".";
                        ParameterInfo[] parameters = property.GetIndexParameters();
                        if (parameters.Length != 0)
                        {
                            name += parameters.joinString(',', value => value.ParameterType.fullName());
                        }
                        HashString nameKey = name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                PublicFields        = members.Values.getFindArray(value => value.PublicField, value => value != null);
                NonPublicFields     = members.Values.getFindArray(value => value.NonPublicField, value => value != null);
                PublicProperties    = members.Values.getFindArray(value => value.PublicProperty, value => value != null);
                NonPublicProperties = members.Values.getFindArray(value => value.NonPublicProperty, value => value != null);
                if (anonymousCount != 0)
                {
                    LeftArray <FieldInfo> anonymousFields = new LeftArray <FieldInfo>();
                    foreach (FieldInfo field in type.GetFields(BindingFlags.NonPublic | staticFlags))
                    {
                        if (field.Name[0] == '<')
                        {
                            HashString nameKey = field.Name;
                            if (!members.ContainsKey(nameKey))
                            {
                                members[nameKey] = new typeDepth();
                                anonymousFields.Add(field);
                            }
                        }
                    }
                    AnonymousFields = anonymousFields.ToArray();
                }
                else
                {
                    AnonymousFields = NullValue <FieldInfo> .Array;
                }
            }
Ejemplo n.º 2
0
            /// <summary>
            /// 动态成员分组
            /// </summary>
            /// <param name="type">目标类型</param>
            /// <param name="isStatic">是否静态成员</param>
            public group(Type type, bool isStatic)
            {
                Dictionary <hashString, typeDepth> members = dictionary.CreateHashString <typeDepth>();
                BindingFlags staticFlags = isStatic ? (BindingFlags.Static | BindingFlags.FlattenHierarchy) : BindingFlags.Instance;
                typeDepth    oldMember;

                foreach (FieldInfo field in type.GetFields(BindingFlags.Public | staticFlags))
                {
                    typeDepth  member  = new typeDepth(type, field, true);
                    hashString nameKey = field.Name;
                    if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                    {
                        members[nameKey] = member;
                    }
                }
                bool isAnonymous = !isStatic && type.Name[0] == '<';

                foreach (FieldInfo field in type.GetFields(BindingFlags.NonPublic | staticFlags))
                {
                    if (field.Name[0] == '<')
                    {
                        if (isAnonymous)
                        {
                            int index = field.Name.IndexOf('>');
                            if (index != -1)
                            {
                                typeDepth  member  = new typeDepth(type, field, false);
                                hashString nameKey = field.Name.Substring(1, index - 1);
                                if (!members.TryGetValue(nameKey, out oldMember))
                                {
                                    members[nameKey] = member;
                                }
                            }
                        }
                    }
                    else
                    {
                        typeDepth  member  = new typeDepth(type, field, false);
                        hashString nameKey = field.Name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                foreach (PropertyInfo property in type.GetProperties(BindingFlags.Public | staticFlags))
                {
                    if (!members.ContainsKey(property.Name))
                    {
                        typeDepth       member     = new typeDepth(type, property, true);
                        string          name       = property.Name + ".";
                        ParameterInfo[] parameters = property.GetIndexParameters();
                        if (parameters.Length != 0)
                        {
                            name += parameters.joinString(',', value => value.ParameterType.fullName());
                        }
                        hashString nameKey = name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                foreach (PropertyInfo property in type.GetProperties(BindingFlags.NonPublic | staticFlags))
                {
                    if (!members.ContainsKey(property.Name))
                    {
                        typeDepth       member     = new typeDepth(type, property, false);
                        string          name       = property.Name + ".";
                        ParameterInfo[] parameters = property.GetIndexParameters();
                        if (parameters.Length != 0)
                        {
                            name += parameters.joinString(',', value => value.ParameterType.fullName());
                        }
                        hashString nameKey = name;
                        if (!members.TryGetValue(nameKey, out oldMember) || member.Depth < oldMember.Depth)
                        {
                            members[nameKey] = member;
                        }
                    }
                }
                PublicFields        = members.Values.getArray(value => value.PublicField).getFindArray(value => value != null);
                NonPublicFields     = members.Values.getArray(value => value.NonPublicField).getFindArray(value => value != null);
                PublicProperties    = members.Values.getArray(value => value.PublicProperty).getFindArray(value => value != null);
                NonPublicProperties = members.Values.getArray(value => value.NonPublicProperty).getFindArray(value => value != null);
            }