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

问题描述 投票:0回答:2

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

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

    }

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

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

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

c# reflection collections
2个回答
1
投票

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

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

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

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

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


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.