IEnumerable <Item> GetNewItems(object[] objects) { var itemByGroupName = new Dictionary <string, HCItemGroup>(); var itemByMember = new Dictionary <Metadata.Member, HCItemMember>(); foreach (var item in rootItems) { var groupItem = item as HCItemGroup; if (groupItem != null) { itemByGroupName.Add(groupItem.Name, groupItem); } var memberItem = item as HCItemMember; if (memberItem != null) { itemByMember.Add(memberItem.Member, memberItem); } } var groups = new EDictionary <string, List <Metadata.Member> >(); //var members = MetadataManager.MetadataGetMembers( obj ); //if( ReverseItems ) // members = members.Reverse(); var firstObject = objects[0]; var membersToAdd = new EDictionary <Metadata.Member, int>(128); //foreach( var member in members ) foreach (var member in MetadataManager.MetadataGetMembers(firstObject)) { if (contentMode == ContentModeEnum.Properties && !(member is Metadata.Property)) { continue; } if (contentMode == ContentModeEnum.Events && !(member is Metadata.Event)) { continue; } if (EditorUtility.IsMemberVisible(member)) { bool skip = false; //Type Settings filter var component = firstObject as Component; if (component != null && !component.TypeSettingsIsPublicMember(member)) { skip = true; } //if( component != null ) //{ //var baseComponentType = component.BaseType as Metadata.ComponentTypeInfo; //if( baseComponentType != null && baseComponentType.BasedOnObject.TypeSettingsIsPrivateObject( member ) ) // skip = true; //} if (!skip) { membersToAdd[member] = 1; } } } for (int nObject = 1; nObject < objects.Length; nObject++) { var obj = objects[nObject]; foreach (var member in MetadataManager.MetadataGetMembers(obj)) { if (membersToAdd.TryGetValue(member, out var counter)) { membersToAdd[member] = counter + 1; } } } foreach (var pair in membersToAdd) { var member = pair.Key; var counter = pair.Value; if (counter == objects.Length) { var groupName = TypeUtility.GetUserFriendlyCategory(member); List <Metadata.Member> list; if (!groups.TryGetValue(groupName, out list)) { list = new List <Metadata.Member>(); groups.Add(groupName, list); } list.Add(member); } } ////foreach( var member in members ) //foreach( var member in MetadataManager.MetadataGetMembers( obj ) ) //{ // if( contentMode == ContentModeEnum.Properties && !( member is Metadata.Property ) ) // continue; // if( contentMode == ContentModeEnum.Events && !( member is Metadata.Event ) ) // continue; // if( EditorUtility.IsMemberVisible( member ) ) // { // bool skip = false; // //Type Settings filter // var component = obj as Component; // if( component != null && !component.TypeSettingsIsPublicMember( member ) ) // skip = true; // //if( component != null ) // //{ // //var baseComponentType = component.BaseType as Metadata.ComponentTypeInfo; // //if( baseComponentType != null && baseComponentType.BasedOnObject.TypeSettingsIsPrivateObject( member ) ) // // skip = true; // //} // if( !skip ) // { // var groupName = TypeUtility.GetUserFriendlyCategory( member ); // List<Metadata.Member> list; // if( !groups.TryGetValue( groupName, out list ) ) // { // list = new List<Metadata.Member>(); // groups.Add( groupName, list ); // } // list.Add( member ); // } // } //} //!!!!change order //reverse groups for Events mode if (ReverseGroups) //if( contentMode == ContentModeEnum.Events ) { var newGroups = new EDictionary <string, List <Metadata.Member> >(groups.Count); foreach (var pair in groups.Reverse()) { newGroups.Add(pair.Key, pair.Value); } groups = newGroups; } foreach (var groupPair in groups) { var groupName = groupPair.Key; var list = groupPair.Value; //update group if (DisplayGroups) { if (!itemByGroupName.TryGetValue(groupName, out HCItemGroup groupItem)) { groupItem = new HCItemGroup(this, null, groupName); } yield return(groupItem); } //update properties of the group foreach (var member in list) { if (!itemByMember.TryGetValue(member, out var item)) { Type itemType = GetSuitableItemType(member); //var originalType = property.Type.GetNetType(); //var unrefType = ReferenceUtils.GetUnreferencedType( originalType ); //Type itemType = HCPropertyItemTypes.GetSuitableType( unrefType ); //!!!!может быть null. Component.MetadataGetMembers в _InvokeMember if (itemType != null) { var property = member as Metadata.Property; if (property != null) { var constructor = itemType.GetConstructor(new Type[] { typeof(HierarchicalContainer), typeof(Item), typeof(object[]), typeof(Metadata.Property), typeof(object[]) }); item = (HCItemMember)constructor.Invoke(new object[] { this, null, SelectedObjects, property, property.Indexers }); } var _event = member as Metadata.Event; if (_event != null) { var constructor = itemType.GetConstructor(new Type[] { typeof(HierarchicalContainer), typeof(Item), typeof(object[]), typeof(Metadata.Event) }); item = (HCItemMember)constructor.Invoke(new object[] { this, null, SelectedObjects, _event }); } } } if (item != null) { yield return(item); } } } }