Mercurial > pub > bltoolkit
diff Extensions/JointureAddOn/Mapping/DataBindingFactory.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Extensions/JointureAddOn/Mapping/DataBindingFactory.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,69 @@ +using System; +using System.ComponentModel; +using Castle.DynamicProxy; + +namespace BLToolkit.Mapping +{ + public static class DataBindingFactory + { + private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator(); + + public static T Create<T>() + { + return (T) Create(typeof (T)); + } + + public static object Create(Type type) + { + return ProxyGenerator.CreateClassProxy(type, new[] + { + typeof (INotifyPropertyChanged), + typeof (IMarkerInterface) + }, new NotifyPropertyChangedInterceptor(type.FullName)); + } + + public interface IMarkerInterface + { + string TypeName { get; } + } + + public class NotifyPropertyChangedInterceptor : IInterceptor + { + private readonly string typeName; + private PropertyChangedEventHandler subscribers = delegate { }; + + public NotifyPropertyChangedInterceptor(string typeName) + { + this.typeName = typeName; + } + + public void Intercept(IInvocation invocation) + { + if (invocation.Method.DeclaringType == typeof (IMarkerInterface)) + { + invocation.ReturnValue = typeName; + return; + } + if (invocation.Method.DeclaringType == typeof (INotifyPropertyChanged)) + { + var propertyChangedEventHandler = (PropertyChangedEventHandler) invocation.Arguments[0]; + if (invocation.Method.Name.StartsWith("add_")) + { + subscribers += propertyChangedEventHandler; + } + else + { + subscribers -= propertyChangedEventHandler; + } + return; + } + invocation.Proceed(); + if (invocation.Method.Name.StartsWith("set_")) + { + var propertyName = invocation.Method.Name.Substring(4); + subscribers(invocation.InvocationTarget, new PropertyChangedEventArgs(propertyName)); + } + } + } + } +} \ No newline at end of file