这可能是一个愚蠢的问题,但我会问它反正......我在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.
}
}
}
你要注意积累也可能“东西”。确保在不再需要它们时将它们从列表中删除。
...虽然你可能想让他们弱引用,而不是... ...并至少在终结者中删除它们......并添加remi的'lock()',如果你的东西将在多个线程上创建的......你在大多数图书馆情况下事先都不知道...... –
请记住你可以在不调用构造函数的情况下创建一个实例:http://stackoverflow.com/questions/296584/c-create-object-instance-without-invoking-constructor –
不,没有。基本上没有办法找到一个类的所有实例,除非你编写自己的代码来做到这一点。
编辑:为什么这是downvoted感染。无论如何,添加更多的细节:你应该避免需要这样做。你可能让你的类型实现IDisposable
,然后在构造函数中注册一个静态事件处理程序,并在Dispose
方法中取消注册。哎呀,你甚至可以有一个终结器为你做这件事,这会花费你的性能,但如果你不能处理实例,至少不会泄漏。
然而,所有这些都是有些严峻的选择。尝试重新设计以避免这种要求会好得多。也许你可以给我们更多关于你想要做什么的信息,我们可以想出一个解决方法?
+1 - 这是重新设计的原因,而不仅仅是更多的代码。让有限的信息 –
+1没有理由拒绝投票,让类的实例订阅观察者而不是尝试调用静态事件处理器。 –
你可以这样做:
public class MyClass{
private static List<MyClass> Instances = new List<MyClass>();
public MyClass(){
lock(typeof(MyClass)){
Instances.Add(this);
}
}}
这一点,你可以做你想要与实例什么都之后。
...并且除非你有内存泄漏'*非常小心*总是确保你删除东西。哦,并且由于该字段是公开的,所以使用它的所有内容都必须小心同步:( –
我编辑以将字段设置为私有.David希望对所有实例执行某些操作,以便他必须小心内存泄漏。 –
我可能是错的理解你的意思,但它应该是简单的...
这是主要的文件
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);
}
}
}
}
确实会导致引发事件,并与静态调用的类的类之间的耦合不幸,但似乎你想要做什么。
- 1. 有没有办法从静态方法调用非静态方法?
- 2. 有没有办法找出方法是静态的还是非静态的?
- 3. 有没有办法让PHP的子类继承属性(静态和实例)?
- 4. 从另一个类访问方法没有静态?
- 5. 有没有办法显式引用非静态内部类实例?
- 6. 我有一个非静态方法
- 7. 有没有办法为静态类方法定义别名?
- 8. 有没有办法确保实现接口的类实现静态方法?
- 9. 非静态类中的静态方法和静态类中的静态方法有什么区别?
- 10. Java - 只有一个类的实例:使用静态方法?
- 11. 通过静态和非静态方法访问静态属性?
- 12. 具有静态和非静态重载的类方法
- 13. 从静态方法调用所有实例的接口方法
- 14. 从C++中的静态方法访问非静态类变量
- 15. 静态方法和非静态方法有什么区别?
- 16. 访问非静态类的静态类
- 17. 从另一个类从静态方法访问实例变量
- 18. 将静态方法放入静态类并将实例方法放入静态类中有什么区别?
- 19. Android的 - 不能让一个静态引用非静态方法
- 20. Node/Express - 有没有办法从控制器方法访问静态文件?
- 21. 如何在静态方法中访问静态和非静态方法
- 22. 具有静态方法的静态类和具有静态方法的常规类之间有什么不同?
- 23. 静态/非静态方法问题
- 24. 静态方法vs静态实例
- 25. C++从公共静态方法访问私有静态成员?
- 26. 静态类方法没有返回值
- 27. 不能让一个静态引用非静态方法
- 28. 无需实例化访问另一个类的非静态方法
- 29. 有没有办法让Zurb Foundation静态/无响应?
- 30. 有没有办法让Flash强制静态打字?
这很混乱。这听起来像是你想从其他类型的实例中触发实例事件处理程序。换句话说,每个实例都会在创建的类的每个其他实例上引发一个事件处理程序......是吗? –
观察者彭博拯救? –
尽管有可能有效的答案,但您可以考虑扩展问题以更多地描述您的方案;可能有更优雅的解决方案,比如观察者模式,或者如果您能够使用GoLive许可证,甚至可以使用Rx,可能很适合您的问题。 –