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

时间:2010-03-01 15:36:48

标签: c# static methods instance non-static

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

4 个答案:

答案 0 :(得分: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.
      }
   }
}

你也要注意积累“事情”。当您不再需要它们时,请确保将它们从列表中删除。

答案 1 :(得分:4)

不,没有。基本上没有办法找到类的所有实例,除非你自己编写代码来实现它。

编辑:对为什么这是低估投票感到好奇。无论如何,要添加更多细节:你应该避免这样做。您可以创建类型实现IDisposable,然后在构造函数中注册静态事件处理程序,并在Dispose方法中取消注册。哎呀,你甚至可以为你做一个终结器,这会花费你的性能,但如果你没有丢弃实例,至少不会泄漏。

然而,所有这些都是一些严峻的选择。尝试重新设计以避免要求会好得多。也许您可以向我们提供有关您尝试做什么的更多信息,我们可以提出解决方法吗?

答案 2 :(得分:1)

你可以这样做:

    public class MyClass{
private static List<MyClass> Instances = new List<MyClass>();

    public MyClass(){
lock(typeof(MyClass)){
Instances.Add(this);
}

}}

在此之后,您可以使用Instances做任何您想做的事。

答案 3 :(得分:1)

我理解你的意思可能是错的,但它应该很简单......

这是主文件

using System;
using IdeaClass;

namespace TestIdeas
{
    class Program
    {
        static void Main(string[] args)
        {
            Ideas i = new Ideas();
            Ideas.triggerMany();
            Console.ReadLine();
        }
    }
}

然后是Ideas类:

using System;

namespace IdeaClass
{
    public class Ideas
    {
        static OtherClass oc = new OtherClass();
        public static void triggerMany()
        {
            oc.runThing("textual");
        }

        public Ideas()
        {
            Ideas.oc.ThingEvent += DoThingHandler;
        }

        public void DoThingHandler(string thing)
        {
            System.Console.WriteLine(thing);
        }
    }
}

然后是另一个班级。

using System;

namespace IdeaClass
{
    class OtherClass
    {
        public delegate void DoThing(string text);
        public event DoThing ThingEvent;

        public void runThing(string text)
        {
            if (ThingEvent != null)
            {
                ThingEvent(text);
            }
        }
    }
}

它确实引起了引发事件的类与具有静态调用的类之间的不幸耦合,但它似乎做了你想要的。