【问题标题】:using typeof() to search for all object使用 typeof() 搜索所有对象
【发布时间】:2016-10-31 20:42:42
【问题描述】:
public class ClassA
{
   int num = 10;
}

ClassA a = new ClassA();
ClassA b = new ClassA();
ClassA c = new ClassA();
a.GetType(); //we can get result "ClassA"

这是我的问题。无论如何,我可以通过使用 typeof(ClassA) 来获取 ClassA 的所有对象吗?或者还有其他方式吗?感谢您的热心帮助

【问题讨论】:

  • “所有对象”是什么意思?您想访问num-字段吗?在这种情况下你需要反思,比如a.GetType().GetField("num")
  • 您是否要获取某种类型的所有当前实例,在本例中为ClassA?因为你won't be able to do that
  • 您真正的需求是什么?这种反射方法似乎是您应该考虑的最后一种方法。为什么不将 nums 存储在 List<int> 中或将实例存储在 List<ClassA> 中?
  • “获取”?从哪里得到?听起来你可能在Reflection之后。
  • 听起来像 xy 问题 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。请描述您的实际问题,而不是您认为应该解决的方式。

标签: c# typeof gettype


【解决方案1】:

C# 没有用于检索所有对象的 API。因此,您必须编写自己的代码。

public class ClassA
{
    int num = 10;

    public static List<ClassA> Objects { get; } = new List<ClassA>();
    public ClassA()
    {
        objects.Add(this);
    }
}

使用静态列表来存储创建的对象。

ClassA a = new ClassA();
ClassA b = new ClassA();
ClassA c = new ClassA();

Console.WriteLine(ClassA.Objects[0]); //a
Console.WriteLine(ClassA.Objects[1]); //b
Console.WriteLine(ClassA.Objects[2]); //c

注意内存泄漏,一旦使用就从列表中删除对象。

【讨论】:

  • 这是一个非常糟糕的主意,因为对象永远不会被最终确定(内存泄漏)。至少应该是 WeakReference。
  • 您必须考虑戴维斯何时检索这些对象。如果你不加考虑地使用 Wea​​kReference,最终会导致对象被意外破坏。
【解决方案2】:

没有办法获取存在于您的方法、线程或其他任何东西中的类的所有实例,您必须自己记住它们。然而,这并不是真正的需要。

假设您有四辆不同的汽车:

Car c1 = new Car();
Car c2 = new Car();
Car c3 = new Car();
Car c4 = new Car();

现在您必须做出选择:要么记住变量名称并尝试使用该名称获取它们所代表的汽车(这是不可能的,因为您很快就会发现),或者将所有 Car-instances 放入一个收藏:

List<Car> cars = new List<Car>();
cars.Add(c1);
cars.Add(c2);
cars.Add(c3);
cars.Add(c4);

现在您不必关心这些变量的名称,因为您可以直接访问它们。例如,您可以通过以下方式访问它们:

Car myCar = cars.Single(x => x.Name == "BMW");

或者:

Car myCar = cars[1]; // get the second car within the collection

【讨论】:

    【解决方案3】:

    如果你愿意

    获取ClassA的所有对象

    您可能希望将ClassA 实例组织成一个集合,例如数组,然后使用Linq

    Object[] source = new Object[] {
      "String",
      new ClassA(), // this 
      new Object(),
      new ClassA(), // and this should be filtered out
      null
    };
    
    ...
    
    ClassA[] result = source
      .OfType<ClassA>()
      .Where(item => item != null) // you may want this filter
      .ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多