public void Dispose() { lock (_fieldInfo.EventHandlers) { _fieldInfo.EventHandlers.Remove(this); } _fieldInfo = null; }
/// <summary> /// [SPECIAL] Called by Field.Value {set;} /// </summary> private void SetValueInternal <T>(BackingFieldInfo field, T value, T previousValue) { if (!field.SetValue(this, value)) { return; } OnPropertyChanged(field.Name, previousValue, value); }
private void AddCore <T>(string name, T value = default(T)) { if (_readOnlyCollection) { throw new InvalidOperationException("The BackingFieldStore is read-only!"); } if (_fields.ContainsKey(name)) { throw new InvalidOperationException("The BackingFieldStore already contains a item with name'" + name + "'!"); } var field = new BackingFieldInfo(name, typeof(T), value, this); _fields.Add(name, field); OnPropertyChanged(name, default(T), value); }
public BackingFieldsStore([NotNull] object owner, Action <string> propertyChangedCallback) { _owner = owner ?? throw new ArgumentNullException(nameof(owner)); _propertyChangedCallback = propertyChangedCallback; var ownerType = _owner.GetType(); if (!TypesDictionary.ContainsKey(owner.GetType())) { var propertyInfos = _owner.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var typeDic = new Dictionary <string, Type>(); foreach (var propertyInfo in propertyInfos) { if (propertyInfo.GetIndexParameters().Length > 0) { continue; //exclude indexer } if (GetLazyAttribute(propertyInfo) != null) { continue; //exclude lazy } var type = propertyInfo.PropertyType; var name = propertyInfo.Name; if (typeDic.ContainsKey(name)) { continue; } typeDic.Add(name, type); } TypesDictionary.Add(ownerType, typeDic); } { var typeDic = TypesDictionary[ownerType]; foreach (var entry in typeDic) { var name = entry.Key; var type = entry.Value; var value = type.IsValueType ? Activator.CreateInstance(type) : null; var field = new BackingFieldInfo(name, type, value, this); _fields.Add(name, field); } } }
// public void SetAndRaise<T>(Expression<Func<object, T>> memberExpression, T value, Action<T> changedCallback) { // if (SetInternal(MemberNameUtil.GetPropertyName(memberExpression), value)) // changedCallback(value); // } // public void SetAndRaise<T>(Expression<Func<T>> memberExpression, T value, Action<T> changedCallback) { // if (SetInternal(MemberNameUtil.GetPropertyName(memberExpression), value)) // changedCallback(value); // } private bool SetValueInternal <T>(string name, T value) { BackingFieldInfo field; if (!_fields.ContainsKey(name)) { field = new BackingFieldInfo(name, typeof(T), this); _fields.Add(name, field); } else { field = _fields[name]; } var previousValue = field.Value; if (!field.SetValue(this, value)) { return(false); } OnPropertyChanged(name, previousValue, value); return(true); }
public EventHandlerInfo(BackingFieldInfo fieldInfo, EventHandler <ValueChangedEventArgs> propertyChangedEventHandler) { _fieldInfo = fieldInfo; PropertyChangedEventHandler = propertyChangedEventHandler; }