【问题标题】:c# list property Add method extra action时间:2018-10-10 标签:c#list property Add method extra action
【发布时间】:2013-07-12 11:47:36
【问题描述】:

我有一个这样的列表属性

protected IList<System.Windows.Media.Color> colors;    
public IList<System.Windows.Media.Color> Colors
{
     get { return colors; }
     set { colors = value; }
}

我有一个功能

protected void updateBuffers()

每次属性用户更改属性时都需要调用它,例如

Colors.Add(...)
...
Colors.Clear(...)

有没有一种优雅简单的方法来做到这一点?

【问题讨论】:

  • 你想在每次颜色变化时调用该函数?
  • 我会指出你,当对象被添加到列表时,函数 .Add 正在为集合运行,你应该覆盖它,参考stackoverflow.com/questions/1626049/overriding-listts-add
  • 尝试创建 List.Add 方法的自定义通用方法,该方法将列表作为参数输入,然后运行所需的方法,即 updateBuffers()。例如 ListAdd(Colors); public void ListAdd(IList List){ List.Add(..);更新缓冲区(); }
  • 不要使用 List,你不能覆盖它的方法。最好使用的类是Collection&lt;T&gt;。与 List 一样工作,但它具有可用于检测添加或修改项目的受保护方法。

标签: c# list properties add


【解决方案1】:

您可以使用 List 作为基类来创建一个创建其他属性的新对象:

public class CustomList<T> : List<T>
{
    public new void Add(T item) {
        base.Add(item);
        this.UpdateBuffers();
    }
}

'new' 关键字是完全覆盖 Add 的现有实现所必需的,它在基类中未标记为 virtual

感谢 Hans Passant 和 LarsTech 对 cme​​ts 的反馈。

【讨论】:

  • 请在发布之前使用 C# 编译器测试您的代码。你会在你的答案中发现一个非常基本的缺陷, List.Add() 方法不是虚拟的,所以不能被覆盖。
  • Hmya,这当然也不起作用。客户端程序员将像往常一样使用 Add() 或使用 IList 方法,它将无法以完全无法诊断的方式工作。你得到了投票最多的答案,让它成为一个有用的答案是你的负担:) 至少谈谈 Collection 类。或者删除你的答案。
  • @HansPassant 这让你对整个投票系统感到好奇
  • @HansPassant public new void Add(T item) {...} 不工作吗?
  • @Lars - 不,当客户端程序员使用对集合的 IList 引用时,仍然会失败。它会调用隐藏方法。
【解决方案2】:

你不能用一个简单的列表。 但是,您可以创建自己的类来实现 IList&lt;T&gt; 或从 Collection&lt;T&gt; 继承。

或者您可以使用ObservableCollection&lt;T&gt; 或任何实现INotifyCollectionChanged 的内置类

有关文档,请参阅 MSDN

此外,如果您使用 ObservableCollection 在 WPF 或 Windows 8 应用程序中填充 UI,则可以在绑定中使用您的集合。

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2013-02-18
    • 2023-03-11
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多