public ResolvedTraitSet Merge(ResolvedTrait toMerge, bool copyOnWrite) { ResolvedTraitSet traitSetResult = this; var trait = toMerge.Trait; List <dynamic> av = null; List <bool> wasSet = null; if (toMerge.ParameterValues != null) { av = toMerge.ParameterValues.Values; wasSet = toMerge.ParameterValues.WasSet; } if (this.HasElevated != true) { this.HasElevated = trait.Elevated; } if (traitSetResult.LookupByTrait.ContainsKey(trait)) { ResolvedTrait rtOld = traitSetResult.LookupByTrait[trait]; List <dynamic> avOld = null; if (rtOld.ParameterValues != null) { avOld = rtOld.ParameterValues.Values; } if (av != null && avOld != null) { // the new values take precedence for (int i = 0; i < av.Count; i++) { if (avOld[i]?.GetType() == typeof(JValue)) { avOld[i] = (string)avOld[i]; } try { if (av[i] != avOld[i]) { if (copyOnWrite) { traitSetResult = traitSetResult.ShallowCopyWithException(trait); rtOld = traitSetResult.LookupByTrait[trait]; avOld = rtOld.ParameterValues.Values; copyOnWrite = false; } avOld[i] = ParameterValue.FetchReplacementValue(this.ResOpt, avOld[i], av[i], wasSet[i]); } } catch { } } } } else { if (copyOnWrite) { traitSetResult = traitSetResult.ShallowCopy(); } toMerge = toMerge.Copy(); traitSetResult.Set.Add(toMerge); traitSetResult.LookupByTrait.Add(trait, toMerge); } return(traitSetResult); }
public void SetValue(ResolveOptions resOpt, dynamic newValue) { this.Value = ParameterValue.FetchReplacementValue(resOpt, this.Value, newValue, true); }