1

警告:下面的示例有点做作,但我正在尝试了解C#中的委托事件

下面的代码由两个类组成:MyClass类包含一个 ArrayList 作为属性、一个委托成员和事件处理程序成员。MainClass只有两个函数,一个是main (),另一个是委托调用的函数,称为theHandler

我的意图是当我添加到 myClass 对象中实例化的 ArrayList 中时:事件处理程序调用theHandler函数并将添加的内容写入控制台的 do-while 循环中的 ClassObj。但是,它似乎没有调用 Handler 函数。

我知道 ArrayList 正在更新,当我使用(字符串)而不是 ArrayList 时,我能够让委托/事件进程正常工作。

public class myClass{

    public delegate void classEventHandler(ArrayList anArray);
    private ArrayList strArray = new ArrayList();
    public event classEventHandler arrayChanged;

    public ArrayList arrayVal{
        get{
            return strArray;
        }
            set{
            this.strArray.Add(value);
            this.arrayChanged(strArray);
        }
    }
}

class MainClass
{
    public static void Main (string[] args)
    {
        myClass ClassObj = new myClass();
        ClassObj.arrayChanged += theHandler;
        string str;

        do{
            str = Console.ReadLine();
            ClassObj.arrayVal.Add(str);
        }while(!str.Equals("exit"));

        Console.ReadLine();
    }

    public static void theHandler(ArrayList newArray){
        foreach(object o in newArray){
            Console.WriteLine("{0}", o.ToString());
        }
    }
}

我的猜测是它与 ArrayLists 被用作类属性有关,但我不确定。

4

2 回答 2

1

问题是它ClassObj.arrayVal.Add(str)不调用该set方法,因为它没有重新定义arrayVal,它只是将另一个元素添加到数组中。您需要一个将元素添加到数组并触发事件的方法:

public class myClass{

    public delegate void classEventHandler(ArrayList anArray);
    private ArrayList strArray = new ArrayList();
    public event classEventHandler arrayChanged;

    public void AddToArray(string value){
            this.strArray.Add(value);
            this.arrayChanged(strArray);
    }
}

然后在你的循环中你这样称呼它:

do{
    str = Console.ReadLine();
    ClassObj.AddToArray(str);
}while(!str.Equals("exit"));

您可能还想查看ObservableCollection类。它允许您设置一个在列表更改时自动调用的处理程序

于 2013-05-09T01:58:58.900 回答
0

仅当您使用一些新值设置属性时才会触发您的事件

ClassObj.arrayVal = new ArrayList()

下一行不会调用set- 但会调用get

ClassObj.arrayVal.Add(str);
于 2013-05-08T23:07:47.430 回答