我没有找到类似的帖子,所以我问这个。
假设我在某处定义了一个应用程序范围内可用的静态属性(我的意思是它不是本地的),并且在一个类中我想知道何时更改此属性。除了aop(transparentproxy等),我觉得这里并不适合我(我无论如何也无法添加到项目中),这里的选项有哪些?
我能想到的一个解决方案,可能是一个非常讨厌的解决方案,就是使用一些将在setter中执行的事件,并将其附加到需要它的类中。 类似的东西:
public static event EventHandler CurrentNumberChanged= delegate {};
public static int CurrentNumber
{
get
{
return currentNumber;
}
set
{
currentNumber = value;
CurrentNumberChanged(null, EventArgs.Empty);
}
}
我知道使用此类事件(read here)确实不安全。因为我会在asp.net中使用它会让它变得更加难看。你有什么建议吗?
答案 0 :(得分:1)
您可以使用观察者模式的变体来获得相同的效果。不确定你的线程要求是什么,我怀疑它会遇到与How to raise custom event from a Static Class类似的解除引用问题(虽然必须更多地使用代码来解决这个问题):
使用System; 使用System.Collections.Generic;
命名空间ClassLibrary1 { 公共类StaticObservable { private static int currentNumber;
private static readonly List<IObserver> observers = new List<IObserver>();
public static int CurrentNumber
{
get{return currentNumber;}
set
{
currentNumber = value;
foreach (var observer in observers)
{
observer.NotifyChange();
}
}
}
public static void Attach(IObserver observer)
{
observers.Add(observer);
}
public static void Detach(IObserver observer)
{
observers.Remove(observer);
}
}
public interface IObserver
{
void NotifyChange();
}
public class ObserverImpl : IObserver
{
public void NotifyChange()
{
Console.Out.WriteLine("Number has changed");
}
}
public class AppWrapper
{
public static void Main (string[] args)
{
Console.ReadLine();
var observerImpl1 = new ObserverImpl();
var observerImpl2 = new ObserverImpl();
StaticObservable.Attach(observerImpl1);
StaticObservable.Attach(observerImpl2);
StaticObservable.CurrentNumber = 1;
Console.ReadLine();
}
}
}
答案 1 :(得分:0)
你提到的答案只是说如果你忘记从静态事件中取消订阅某个实例,那么这个实例将永远存在。
答案 2 :(得分:0)
我认为EventHandler有点太多了,为什么不在类中创建一些需要接收消息的布尔标志,每当触发CurrentNumber的setter时,调用该布尔标志的setter。
我想在这里更具描述性,但数据不足以建议实际的代码。