【问题标题】:Is it possible to get the Collection using reflection if i have the member of collection?如果我有集合成员,是否可以使用反射获取集合?
【发布时间】:2018-03-27 09:37:15
【问题描述】:

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

 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 集合的成员,那么是否可以使用反射获得该对象所属的完整集合? 如果无法使用反射,那么是否有其他方法可以实现上述目标。

【问题讨论】:

  • “有没有可能收藏...” 有什么可能?为什么你需要反思?这应该是最后的手段。
  • 不,引用只是一种方式StudentCollection -> Student。您需要直接引用集合来确定集合内容。
  • 如果你需要它提供一个属性StudentCollection Collection并从构造函数初始化它
  • 如何获得对集合的直接引用以确定集合内容。 @thehennyy
  • 学生类或 StudentCollection 类中的属性? @TimSchmelter

标签: c# reflection collections


【解决方案1】:

我想你的意思是,给定一个实例(例如Student student),我可以获取该实例所属的集合吗?

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

如果您有多个集合(例如List&lt;StudentCollection&gt; studentCollections),那么您可以搜索所有集合以找到包含该实例的列表。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    如果您的“候选”收藏数量有限,您可以致电Collection.Contains(item) 检查其中是否包含该项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多