这可能是一个愚蠢的问题,但我还是要问一下...我正在使用C#.NET编程。我有一个包含非静态实例EventHandler的类。是否有可能从静态方法中触发该类的每个实例的EventHandler?我知道这很难!
这可能是一个愚蠢的问题,但我还是要问一下...我正在使用C#.NET编程。我有一个包含非静态实例EventHandler的类。是否有可能从静态方法中触发该类的每个实例的EventHandler?我知道这很难!
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.
}
}
}
你需要注意不要积累太多的“物品”。确保在不需要它们时从列表中删除它们。
lock()
。这在大多数库情况下是无法预先知道的。 - Pontus Gagge没有,基本上找不到所有类的实例的方法,除非你自己编写代码来做这件事。
编辑:不知道为什么会被踩。总之,再补充一点细节:你应该避免需要这样做。你可以让你的类型实现 IDisposable
,然后在构造函数中注册一个静态事件处理程序,在Dispose
方法中取消注册。甚至可以有一个终结器来为您执行此操作,这将为您带来性能损失,但如果您未能处理实例,则至少不会泄漏。
然而,这些都是相当严峻的选项。最好的方法是尽量重新设计以避免这种要求。也许您可以给我们更多关于您所尝试做的事情的信息,我们可以想出一个解决方法?
public class MyClass{
private static List<MyClass> Instances = new List<MyClass>();
public MyClass(){
lock(typeof(MyClass)){
Instances.Add(this);
}
}}
在此之后,您可以随心所欲地处理实例。
我可能误解了你的意思,但应该很简单...
这是主文件
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);
}
}
}
}
这确实会导致事件引发类和静态调用类之间的不必要耦合,但它似乎可以实现你想要的功能。