Esempio n. 1
0
 internal void ReplaceClientSettings(TypeSettingsValue value)
 {
     ThrowIfFrozen();
     if (_settingsValueFinalSet)
     {
         ThrowFrozen();
     }
     _settingsValueByClient = value;
 }
Esempio n. 2
0
        void ChangeSettings(Func <TypeSettingsValue, TypeSettingsValue> setter)
        {
            ThrowIfFrozen();
            if (_settingsValueFinalSet)
            {
                ThrowFrozen();
            }
            var sv = setter(_settingsValueByClient);

            ThrowIfInvalidSettings(sv);
            Helpers.MemoryBarrier();
            _settingsValueByClient = sv;
        }
Esempio n. 3
0
        void ThrowIfInvalidSettings(TypeSettingsValue sv)
        {
            if (sv.IgnoreListHandling && Type.IsArray)
            {
                throw new InvalidOperationException("Can't disable list handling for arrays");
            }

            if (sv.ConstructType != null && !Helpers.IsAssignableFrom(this.Type, sv.ConstructType))
            {
                throw new ArgumentException("Specified construct type " + sv.ConstructType.Name + " is not assignable to " + this.Type.Name);
            }

            if (sv.Member.Collection.ConcreteType != null && !Helpers.IsAssignableFrom(this.Type, sv.Member.Collection.ConcreteType))
            {
                throw new ArgumentException("Specified collection concrete type " + sv.Member.Collection.ConcreteType.Name + " is not assignable to " + this.Type.Name);
            }
        }
Esempio n. 4
0
        internal void FinalizeSettingsValue()
        {
            if (_settingsValueFinalSet)
            {
                return;
            }

            int opaqueToken = 0;

            try
            {
                _model.TakeLock(ref opaqueToken);

                if (_settingsValueFinalSet)
                {
                    return;
                }

                _settingsValueFinal = _settingsValueByClient;

                ThrowIfInvalidSettings(_settingsValueFinal);
                FinalizingOwnSettings?.Invoke(this, new FinalizingOwnSettingsArgs(this));
                ThrowIfInvalidSettings(_settingsValueFinal);

                MemberLevelSettingsValue m = _settingsValueFinal.Member;

                if (_settingsValueFinal.EnumPassthru == null && Helpers.IsEnum(Type))
                {
#if WINRT
                    _settingsValueFinal.EnumPassthru = _typeInfo.IsDefined(typeof(FlagsAttribute), false);
#else
                    _settingsValueFinal.EnumPassthru = Type.IsDefined(_model.MapType(typeof(FlagsAttribute)), false);
#endif
                }

                if (_settingsValueFinal.IgnoreListHandling)
                {
                    m.Collection.ItemType = null;
                    m.Collection.Format   = CollectionFormat.NotSpecified;
                    m.Collection.PackedWireTypeForRead = null;
                }
                else if (m.Collection.ItemType == null)
                {
                    m.Collection.ItemType = Type.IsArray ? Type.GetElementType() : TypeModel.GetListItemType(_model, Type);
                }

                m.Collection.ConcreteType = _settingsValueFinal.ConstructType;

                if (_settingsValueFinal.PrefixLength == null && !IsSimpleValue)
                {
                    _settingsValueFinal.PrefixLength = true;
                }

                _settingsValueFinal.Member = m;

                Helpers.MemoryBarrier();
                _settingsValueFinalSet = true;
                IsFrozen = true;
            }
            finally
            {
                _model.ReleaseLock(opaqueToken);
            }
        }