这可能是一个愚蠢的问题,但无论如何我都要问它......我正在用C#.NET编程。我有一个包含非静态实例EventHandler的类。是否可以为静态方法中存在的类的每个实例触发该EventHandler?我知道这是一个很长的镜头!
答案 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);
}
}
}
}
它确实引起了引发事件的类与具有静态调用的类之间的不幸耦合,但它似乎做了你想要的。