コード例 #1
0
 public void Dispose()
 {
     lock (_fieldInfo.EventHandlers) {
         _fieldInfo.EventHandlers.Remove(this);
     }
     _fieldInfo = null;
 }
コード例 #2
0
 /// <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);
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
                }
            }
        }
コード例 #5
0
//		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);
        }
コード例 #6
0
 public EventHandlerInfo(BackingFieldInfo fieldInfo, EventHandler <ValueChangedEventArgs> propertyChangedEventHandler)
 {
     _fieldInfo = fieldInfo;
     PropertyChangedEventHandler = propertyChangedEventHandler;
 }