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