有没有办法让静态方法访问类的所有非静态实例?

PIC*_*ain 4 c# methods static instance non-static

这可能是一个愚蠢的问题,但无论如何我都会问它......我正在用C#.NET编程.我有一个包含非静态实例EventHandler的类.是否可以为静态方法中存在的类的每个实例触发该EventHandler?我知道这是一个很长的镜头!

Jon*_*eet 5

不,没有。基本上没有办法找到类的所有实例,除非您编写自己的代码来执行此操作。

编辑:很好奇为什么这会被否决。无论如何,添加更多细节:您应该避免这样做。您可以使您的类型实现IDisposable,然后在构造函数中注册静态事件处理程序,并在Dispose方法中取消注册。哎呀,您甚至可以有一个终结器来为您执行此操作,这会降低您的性能,但如果您未能处置实例,至少不会泄漏。

然而,所有这些都是有些严峻的选择。最好尝试重新设计以避免该要求。也许您可以向我们提供有关您正在尝试执行的操作的更多信息,然后我们可以提出解决方法?


Dav*_*ton 5

您可以这样做,但您需要创建所有对象的静态集合:

public class Thing
{
   public static List<Thing> _things = new List<Thing>();

   public Thing()
   {
       _things.Add(this);
   }

   public static void SomeEventHandler(object value, EventHandler e)
   {
      foreach (Thing thing in _things)
      {
           // do something.
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

你也要注意积累"物".当您不再需要它们时,请确保将它们从列表中删除.

  • ...虽然你可能想让它们成为弱引用......并且至少在终结器中删除它们......如果你的东西将在多个线程上创建,则添加remi的`lock()`...你在大多数图书馆的情况下都不知道... (2认同)