2010-03-01 84 views
4

这可能是一个愚蠢的问题,但我会问它反正......我在C#.NET中编程。我有一个包含非静态实例EventHandler的类。是否有可能为静态方法中存在的类的每个实例触发该EventHandler?我知道这是一个长镜头!有没有办法让静态方法访问一个类的所有非静态实例?

+0

这很混乱。这听起来像是你想从其他类型的实例中触发实例事件处理程序。换句话说,每个实例都会在创建的类的每个其他实例上引发一个事件处理程序......是吗? –

+1

观察者彭博拯救? –

+0

尽管有可能有效的答案,但您可以考虑扩展问题以更多地描述您的方案;可能有更优雅的解决方案,比如观察者模式,或者如果您能够使用GoLive许可证,甚至可以使用Rx,可能很适合您的问题。 –

回答

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

你要注意积累也可能“东西”。确保在不再需要它们时将它们从列表中删除。

+2

...虽然你可能想让他们弱引用,而不是... ...并至少在终结者中删除它们......并添加remi的'lock()',如果你的东西将在多个线程上创建的......你在大多数图书馆情况下事先都不知道...... –

+1

请记住你可以在不调用构造函数的情况下创建一个实例:http://stackoverflow.com/questions/296584/c-create-object-instance-without-invoking-constructor –

4

不,没有。基本上没有办法找到一个类的所有实例,除非你编写自己的代码来做到这一点。

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

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

+0

+1 - 这是重新设计的原因,而不仅仅是更多的代码。让有限的信息 –

+0

+1没有理由拒绝投票,让类的实例订阅观察者而不是尝试调用静态事件处理器。 –

1

你可以这样做:

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

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

}} 

这一点,你可以做你想要与实例什么都之后。

+2

...并且除非你有内存泄漏'*非常小心*总是确保你删除东西。哦,并且由于该字段是公开的,所以使用它的所有内容都必须小心同步:( –

+0

我编辑以将字段设置为私有.David希望对所有实例执行某些操作,以便他必须小心内存泄漏。 –

1

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

这是主要的文件

using System; 
using IdeaClass; 

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

于是就有了想法类:

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

确实会导致引发事件,并与静态调用的类的类之间的耦合不幸,但似乎你想要做什么。

相关问题