C# 附加到属性';二传手

C# 附加到属性';二传手,c#,C#,我还没有找到类似的帖子,所以我在问这个问题。 假设我在某个地方定义了一个应用程序范围的可用静态属性(我的意思是它不是本地的),在一个类中,我想知道这个属性何时被更改。除了aop(transparentproxy等),我认为这不适合我(我无论如何也不能将其添加到项目中),这里有哪些选项 我能想到的一个解决方案,可能是一个非常糟糕的解决方案,就是使用一些将在setter中执行的事件,并将其附加到需要它的类中。 比如: public static event EventHandler Curre

我还没有找到类似的帖子,所以我在问这个问题。
假设我在某个地方定义了一个应用程序范围的可用静态属性(我的意思是它不是本地的),在一个类中,我想知道这个属性何时被更改。除了aop(transparentproxy等),我认为这不适合我(我无论如何也不能将其添加到项目中),这里有哪些选项

我能想到的一个解决方案,可能是一个非常糟糕的解决方案,就是使用一些将在setter中执行的事件,并将其附加到需要它的类中。 比如:

   public static event EventHandler CurrentNumberChanged= delegate {};
   public static int CurrentNumber
    {
        get
        {
            return currentNumber;
        }
        set
        {
            currentNumber = value;

            CurrentNumberChanged(null, EventArgs.Empty);
        }
    }

我知道使用这样的事件是非常不安全的()。因为我会在asp.net中使用它,所以它更难看。你有什么建议吗?

你刚才提到的答案是,如果你忘记从静态活动中取消订阅instance,那么这个实例将永远存在

我认为EventHandler有点太多了,为什么不在需要接收消息的类中使用setter创建一些布尔标志,并且每当触发CurrentNumber的setter时,调用该布尔标志的setter。

我想在这里更具描述性,但数据不足以表明实际代码。

您可以使用观察者模式的变体来达到相同的效果。我不确定您的线程需求是什么,我怀疑这也会遇到类似的解引用问题(尽管需要对代码进行更多的处理才能彻底解决):

使用制度; 使用System.Collections.Generic

命名空间类库1 { 公共类静态可观测 { 私有静态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();
    }
}
private static readonly List observer=new List();
公共静态整数当前数
{
获取{return currentNumber;}
设置
{
currentNumber=值;
foreach(观察者中的var观察者)
{
observer.NotifyChange();
}
}
}
公共静态无效附加(IObserver观察员)
{
添加观察员(观察员);
}
公共静态void分离(IObserver观察员)
{
观察员。移除(观察员);
}
}
公共接口IObserver
{
void NotifyChange();
}
公共类observer impl:IObserver
{
公共更改()
{
Console.Out.WriteLine(“编号已更改”);
}
}
公共类AppWrapper
{
公共静态void Main(字符串[]args)
{
Console.ReadLine();
var observer impl1=新的observer impl();
var observer impl2=新的observer impl();
StaticObservable.Attach(observerImpl1);
StaticObservable.Attach(observerImpl2);
StaticObservable.CurrentNumber=1;
Console.ReadLine();
}
}

}

首先要做的是重新考虑设计。如果您仍然需要访问它,您必须非常小心地始终取消订阅该事件,否则很可能会造成巨大的内存泄漏。这与此无关,因为该类无法从属性访问,当然该类也不是静态的。