如果我有集合的成员,是否可以使用反射获取集合?

时间:2018-03-27 09:37:16

标签: c# reflection collections

我有一个示例实体学生,如下所示。

 public class Student
    {
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }

        private int _credits;
        public int Credits
        {
            get
            {
                return _credits;
            }
            set
            {
                _credits = value;
            }
        }

    }

我有另一个Class,它是System.Collections.ObjectModel.Collection的后代,如下所示。

   public class StudentCollection : System.Collections.ObjectModel.Collection<Student>
    {
        //SomeCollection level validations.
    }

现在我正在创建像StudentCollection c1 = new StudentCollection();这样的学生集合。 问题是如果我有一个学生对象是c1集合的成员那么是否有可能获得对象所属的完整集合使用反射? 如果不可能使用反射,那么还有其他方法可以通过以上方式实现。

2 个答案:

答案 0 :(得分:1)

我认为你的意思是,给定一个实例(例如Student student),我可以获得该实例所属的集合。

如果是这样,答案是否定的,而不仅仅是学生。

如果您有多个集合(例如List<StudentCollection> studentCollections),那么您可以搜索所有集合以查找包含该实例的列表。

var collection = studentCollections.Where(collection => collection.Contains(student)).SingleOrDefault();

集合将是包含学生的集合,如果没有匹配则为null。 如果集合变大,性能可能会非常糟糕。在这种情况下,您可能希望查看某种索引,可能使用Dictionary。

答案 1 :(得分:0)

是的,但可能不是你想要的。

如果您有“item”,则可以遍历范围内的所有对象,如果对象是集合,请使用Collection.Contains(item)检查集合是否包含该项目。请注意,可能有多个集合包含相同的项目。

这将是一个非常昂贵的操作,并且实现起来非常复杂,因此很可能不适合您的目的,除非您正在制作某种调试工具或类似工具。

如果您拥有数量有限的“候选”合集,则可以通过致电Collection.Contains(item)来检查其中是否包含该项目。