C#自定义事件处理程序

C#自定义事件处理程序,c#,properties,event-handling,C#,Properties,Event Handling,如果我有财产: public list<String> names { get; set; } 公共列表名称{get;set;} 每当名称添加到列表中时,我如何为名为“onNamesChanged”的参数生成和处理自定义事件?您应该查看,特别是。David Mohundro展示了一种方法;另一个选项是从集合继承并重写各种方法: class Foo {} class FooCollection : Collection<Foo> { protected over

如果我有财产:

public list<String> names { get; set; }
公共列表名称{get;set;}

每当名称添加到列表中时,我如何为名为“onNamesChanged”的参数生成和处理自定义事件?

您应该查看,特别是。

David Mohundro展示了一种方法;另一个选项是从集合继承并重写各种方法:

class Foo {}
class FooCollection : Collection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        // your code...
        base.InsertItem(index, item);
    }
    protected override void SetItem(int index, Foo item)
    {
        // your code...
        base.SetItem(index, item);
    }
    // etc
}
class Foo{}
类集合:集合
{
受保护的重写void插入项(int索引,Foo项)
{
//你的代码。。。
基本插入项(索引,项目);
}
受保护的覆盖无效集合项(int索引,Foo项)
{
//你的代码。。。
base.SetItem(索引,项);
}
//等
}

最后,您可以根据第一原则创建自己的列表(IList,IList)——大量工作,几乎没有好处。

绑定列表可能是您的最佳选择,因为它内置了更改跟踪和各种可使用的现有事件。下面是一个为Add公开自定义事件的示例,该事件将转发到BindingList事件


    class Example
    {
        private BindingList<string> m_names = new BindingList<string>();
        public IEnumerable<string> Names { get { return m_names; } }
        public event AddingNewEventHandler NamesAdded
        {
            add { m_names.AddingNew += value; }
            remove { m_names.AddingNew -= value; }
        }
        public void Add(string name)
        {
            m_names.Add(name);
        }
    }

课例
{
私有BindingList m_names=新BindingList();
公共IEnumerable名称{get{return m_Names;}}
公共事件添加新增事件处理程序名称已添加
{
添加{m_names.AddingNew+=value;}
删除{m_names.AddingNew-=value;}
}
公共无效添加(字符串名称)
{
m_名称。添加(名称);
}
}

BindingList的一种替代方法是-在这种情况下,您希望为事件订阅自己的事件处理程序,并根据操作触发事件。

非传统方法可能是使用AOP框架,例如PostSharp,在调用访问器之前/之后“编织”处理程序,从而触发事件

创建一个外部类,其中包含访问属性时的前置和/或后置处理代码,检查属性值在前置和后置之间是否发生更改,并引发事件


请记住,在获取值进行比较时(在处理程序代码中),您可能会进入一个无限循环(您调用属性访问器,它调用AOP处理程序,它调用访问器等等),因此您可能需要反射到包含此属性的类中以获得支持字段。

Whoa,我不知道你能在活动中做到这一点!那太好了!很不错的。我不知道这是可能的