C# 每次修改列表(未访问)时运行方法

C# 每次修改列表(未访问)时运行方法,c#,list,C#,List,这与问题非常相似,但仅限于列表 每次修改列表时,我都想运行一个方法 我假设使用一个属性并将一个方法放在“set”中是正确的方法。我是这样开始的 public class Stuff { private List<Things> _myThings; public List<Things> MyThings { get { return _myThings; }

这与问题非常相似,但仅限于列表

每次修改列表时,我都想运行一个方法

我假设使用一个属性并将一个方法放在“set”中是正确的方法。我是这样开始的

public class Stuff
{
   private List<Things> _myThings;

   public List<Things> MyThings
    {
        get 
        {
            return _myThings;       
        }
        private set
        {
            _myThings= value;
            runWhenListIsChanged();
        }
    }
}
它直接进入“get”属性,列表被更改

我错误地认为它会使用set(因为它会更改列表),但事实并非如此。调试时(使用Visual Studio中的“单步执行”工具),我注意到可以使用“get”访问器修改列表

在这种情况下,我不希望每次列表被某个对象读取时都调用一个方法,因为这可能会导致性能下降或导致堆栈溢出。所以这不是一个选择


如果有人有任何提示或代码建议,我将不胜感激!非常感谢。

正如您所观察到的,您编写的用于操作列表的代码实际上并没有在属性中设置新列表

相反,此代码:

Stuff.MyThings.RemoveAt(5);
可以认为与此类似:

var list = Stuff.MyThings;
list.RemoveAt(5);
因此,它从getter中读取列表,然后直接操作列表本身

要在列表本身发生更改时获取通知,您需要使用除
list
之外的其他内容,因为此类型没有任何支持该要求的功能

一个很好的候选者是,您可以将事件处理程序连接到事件

请注意,这只会观察列表的更改,而不会观察列表中的元素。如果从列表中添加或删除项目,将收到通知,但如果执行以下代码:

MyStuff.MyThings[0].SomeProperty = SomeNewValue;

那么您将不会从列表本身获得任何通知。您必须在元素类型上实现类似的功能,并将事件处理程序连接到该功能以获取这些通知。

您可以使用
observateCollection
,并注册
CollectionChangedEvent
。任何对收藏的操纵都会触发。谢谢你,小姑娘。我应该补充一点,我使用的是Unity 5.3,它没有.net 4.5+(我相信),所以我可能需要添加我自己的可观察集合脚本。
MyStuff.MyThings[0].SomeProperty = SomeNewValue;