我没有看到有人用一种方法来回答你的List<T>中发生的事情。
为此,您将为您的列表创建一个基本的小包装器,其中至少包含一个您需要连接的 EventHandler 对象。
这是我刚刚汇总的一个非常基本的实现:
public class SubscribeList<T> : IList<T> {
private List<T> list;
public EventHandler OnListContentsChange;
public SubscribeList() {
list = new List<T>();
}
public int IndexOf(T item) {
return list.IndexOf(item);
}
public void Insert(int index, T item) {
list.Insert(index, item);
OnListContentsChange(this, EventArgs.Empty);
}
public void RemoveAt(int index) {
list.RemoveAt(index);
OnListContentsChange(this, EventArgs.Empty);
}
public T this[int index] {
get {
throw new NotImplementedException(); // do this if you want,
}
set {
throw new NotImplementedException(); // but it is more complicated
}
}
public void Add(T item) {
list.Add(item);
OnListContentsChange(this, EventArgs.Empty);
}
public void Clear() {
list.Clear();
OnListContentsChange(this, EventArgs.Empty);
}
public bool Contains(T item) {
return list.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex) {
list.CopyTo(array, arrayIndex);
OnListContentsChange(this, EventArgs.Empty);
}
public int Count {
get { return list.Count; }
}
public bool IsReadOnly {
get { return false; }
}
public bool Remove(T item) {
var ok = list.Remove(item);
if (ok) {
OnListContentsChange(this, EventArgs.Empty);
}
return ok;
}
public IEnumerator<T> GetEnumerator() {
foreach (var item in list) yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return list.GetEnumerator();
}
}
现在,你是这么说的:
总结:我需要在一个公共类中创建一个指向另一个类中的静态列表的变量。
好的,让我们从另一个类中的静态列表开始。别笑:
public class AnotherClass {
public static SubscribeList<String> List;
static AnotherClass() {
List = new SubscribeList<string>();
List.OnListContentsChange += new EventHandler(List_ContentsChanged);
}
private static void List_ContentsChanged(object sender, EventArgs e) {
Console.WriteLine("The contents of the list have changed! Call your Redraw Code.");
}
}
OnListContentsChanged EventHandler 必须连接起来,以便您的代码知道在列表更改时如何做出反应。
现在,要在指向此列表的公共类中创建变量,您可以执行以下操作:
public class PublicClass {
private SubscribeList<String> list;
public PublicClass() {
list = AnotherClass.List;
}
private void someButton_Click(object sender, EventArgs e) {
list.Add("Someone or txtName.Text from your form"); // this will fire the AnotherClass.List_ContentsChanged EventHandler.
}
}
请注意,我创建了一个虚构的按钮单击事件,它将一个项目添加到您的静态列表中。
另外,请注意,如果您在 AnotherClass 中的 List 从未创建过,您将在此处抛出异常。
如果这不是你想要的,那我就是不明白你的问题。