コード例 #1
0
ファイル: ResolvedTraitSet.cs プロジェクト: sunday-out/CDM
        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);
        }
コード例 #2
0
 public void SetValue(ResolveOptions resOpt, dynamic newValue)
 {
     this.Value = ParameterValue.FetchReplacementValue(resOpt, this.Value, newValue, true);
 }