internal void ReplaceClientSettings(TypeSettingsValue value) { ThrowIfFrozen(); if (_settingsValueFinalSet) { ThrowFrozen(); } _settingsValueByClient = value; }
void ChangeSettings(Func <TypeSettingsValue, TypeSettingsValue> setter) { ThrowIfFrozen(); if (_settingsValueFinalSet) { ThrowFrozen(); } var sv = setter(_settingsValueByClient); ThrowIfInvalidSettings(sv); Helpers.MemoryBarrier(); _settingsValueByClient = sv; }
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); } }
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); } }