public ObservablePropertyFactory <TObject, TProperty> GetFactory <TObject, TProperty>(Expression <Func <TObject, TProperty> > expression)
            where TObject : INotifyPropertyChanged
        {
            var key = expression.ToCacheKey();

            var result = _factories.GetOrAdd(key, k =>
            {
                ObservablePropertyFactory <TObject, TProperty> factory;

                var memberChain = expression.GetMemberChain().ToArray();
                if (memberChain.Length == 1)
                {
                    factory = new ObservablePropertyFactory <TObject, TProperty>(expression);
                }
                else
                {
                    var chain    = memberChain.Select(m => new ObservablePropertyPart(m)).ToArray();
                    var accessor = expression?.Compile() ?? throw new ArgumentNullException(nameof(expression));
                    factory      = new ObservablePropertyFactory <TObject, TProperty>(accessor, chain);
                }

                return(factory);
            });

            return((ObservablePropertyFactory <TObject, TProperty>)result);
        }
Exemple #2
0
        public ObservablePropertyFactory <TObject, TProperty> GetFactory <TObject, TProperty>(Expression <Func <TObject, TProperty> > expression)
            where TObject : INotifyPropertyChanged
        {
            var key = expression.ToCacheKey();

            // ReSharper disable once InconsistentlySynchronizedField
            var exiting = _factories.Lookup(key);

            if (exiting.HasValue)
            {
                return((ObservablePropertyFactory <TObject, TProperty>)exiting.Value);
            }

            lock (_locker)
            {
                if (_factories.ContainsKey(key))
                {
                    return((ObservablePropertyFactory <TObject, TProperty>)_factories[key]);
                }

                ObservablePropertyFactory <TObject, TProperty> factory;

                var memberChain = expression.GetMemberChain().ToArray();
                if (memberChain.Length == 1)
                {
                    factory = new ObservablePropertyFactory <TObject, TProperty>(expression);
                }
                else
                {
                    var chain    = memberChain.Select(m => new ObservablePropertyPart(m)).ToArray();
                    var accessor = expression?.Compile() ?? throw new ArgumentNullException(nameof(expression));
                    factory = new ObservablePropertyFactory <TObject, TProperty>(accessor, chain);
                }

                _factories[key] = factory;
                return(factory);
            }
        }