C# 属性修改 触发某事件
2017-03-07 19:59
295 查看
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Dynamic; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; namespace 属性监视 { public partial class Form1 : Form { class EntityNotifier<T> : DynamicObject where T : new() { public class ObjectChangedEventArgs : EventArgs { public string PropertyName { get; set; } public object OldValue { get; private set; } public ObjectChangedEventArgs(string name, object value) { PropertyName = name; OldValue = value; } } private T innerObject { get; set; } public EntityNotifier() { innerObject = new T(); } public EntityNotifier(T obj) { innerObject = obj; } public static implicit operator EntityNotifier<T>(T obj) { return new EntityNotifier<T>(obj); } public static implicit operator T(EntityNotifier<T> obj) { return obj.innerObject; } public override bool TryGetMember(GetMemberBinder binder, out object result) { var p = typeof(T).GetProperties().SingleOrDefault(x => x.Name == binder.Name); if (p == default(PropertyInfo)) { result = null; return false; } else { result = p.GetValue(innerObject, new object[] { }); return true; } } public override bool TrySetMember(SetMemberBinder binder, object value) { var p = typeof(T).GetProperties().SingleOrDefault(x => x.Name == binder.Name); if (p == default(PropertyInfo)) { return false; } else { object oldvalue = p.GetValue(innerObject, new object[] { }); p.SetValue(innerObject, value, new object[] { }); if (ObjectChanged != null) ObjectChanged(this, new ObjectChangedEventArgs(binder.Name, oldvalue)); return true; } } public event EventHandler<EntityNotifier<T>.ObjectChangedEventArgs> ObjectChanged; } class Person { public int ID { get; set; } public string Name { get; set; } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { dynamic person = new EntityNotifier<Person>(); person.ObjectChanged += new EventHandler<EntityNotifier<Person>.ObjectChangedEventArgs>((x, y) => { Console.WriteLine("obj.{0} changed.", y.PropertyName); }); person.Name = "张三"; Person p = person; Console.WriteLine(p.ID.ToString()); } } }
相关文章推荐
- 修改protect属性, 可能会触发rowfocuschanged事件
- 通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程
- C#代表元及事件触发 转载
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- C#中的事件触发
- setAttribute()添加了事件属性,却无法触发事件的问题
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件_转摘
- Select中使用js动态修改了Option时如何触发onchange事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件(转,这篇应该是最好的)
- 在C#中使用代理的方式触发事件
- C#方法,属性,和事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- 在C#中使用代理的方式触发事件
- C#代表元及事件触发