附加到Property setter

时间:2010-03-14 18:46:45

标签: c#

我没有找到类似的帖子,所以我问这个。
假设我在某处定义了一个应用程序范围内可用的静态属性(我的意思是它不是本地的),并且在一个类中我想知道何时更改此属性。除了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中使用它会让它变得更加难看。你有什么建议吗?

3 个答案:

答案 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。
我想在这里更具描述性,但数据不足以建议实际的代码。