コード例 #1
0
        public GraphNodePath GetPath(IContentNode node)
        {
            GraphNodePath path;
            var graphNode = node as IGraphNode;
            if (graphNode == null)
                return null;

            registeredNodes.TryGetValue(graphNode, out path);
            return path;
        }
コード例 #2
0
        public ExpressionIssue TryEvaluate(IContentNode input, out IContentNode result)
        {
            result = Constant;

            return(null);
        }
コード例 #3
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override Type Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(null);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(null);
            }

            try
            {
                if (checkNullValue && this.IsNullValue(value))
                {
                    return(null);
                }

                return(Type.GetType(value.ToString()));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
コード例 #4
0
 private static GraphNodeViewModel DefaultCreateNode(GraphViewModel viewModel, string baseName, bool isPrimitive, IContentNode modelNode, GraphNodePath graphNodePath, Type contentType, Index index)
 {
     return(GraphNodeViewModel.Create(viewModel, baseName, isPrimitive, modelNode, graphNodePath, contentType, index));
 }
コード例 #5
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">
        /// </exception>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            try
            {
                double ret = 0d;
                for (var i = 7; i <= 19; i++)
                {
                    switch (value[i])
                    {
                    case '0':
                    {
                    }
                    break;

                    case '1':
                    {
                        ret += GetInteger(20 - i);
                    }
                    break;

                    case '2':
                    {
                        ret += 2 * GetInteger(20 - i);
                    }
                    break;

                    case '3':
                    {
                        ret += 3 * GetInteger(20 - i);
                    }
                    break;

                    case '4':
                    {
                        ret += 4 * GetInteger(20 - i);
                    }
                    break;

                    case '5':
                    {
                        ret += 5 * GetInteger(20 - i);
                    }
                    break;

                    case '6':
                    {
                        ret += 6 * GetInteger(20 - i);
                    }
                    break;

                    case '7':
                    {
                        ret += 7 * GetInteger(20 - i);
                    }
                    break;

                    case '8':
                    {
                        ret += 8 * GetInteger(20 - i);
                    }
                    break;

                    case '9':
                    {
                        ret += 9 * GetInteger(20 - i);
                    }
                    break;

                    default:
                        throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0,9]范围内", (node.Segment.Offset).ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
                    }
                }

                return(_1970.AddMilliseconds(ret));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0-9]范围内", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
コード例 #6
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override decimal?Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(null);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(null);
            }

            if (checkNullValue && this.IsNullValue(value))
            {
                return(null);
            }

            return(MethodProviders.DecimalMethodProvider.Default.Parse(reader, setting, node, false));
        }
コード例 #7
0
 protected override void LinkNodes(IContentNode sourceNode, IContentNode targetNode)
 {
     LinkedNodes.Add(sourceNode, targetNode);
     base.LinkNodes(sourceNode, targetNode);
 }
コード例 #8
0
            protected override ObjectReference FindTargetReference(IContentNode sourceNode, IContentNode targetNode, ObjectReference sourceReference)
            {
                if (sourceReference.Index.IsEmpty)
                {
                    return(base.FindTargetReference(sourceNode, targetNode, sourceReference));
                }

                var matchValue = 0;

                if (sourceReference.TargetNode != null)
                {
                    matchValue = (int)sourceReference.TargetNode[nameof(SimpleClass.Member1)].Value;
                }

                var targetReference = targetNode.ItemReferences;

                return(targetReference?.FirstOrDefault(x => (int)x.TargetNode[nameof(SimpleClass.Member1)].Value == matchValue));
            }
コード例 #9
0
 public static IContentNode Root(this IContentNode node)
 {
     return(node.RootInternal());
 }
コード例 #10
0
 public static bool IsNullOrEmpty(this IContentNode node)
 {
     return(node == null || node.IsEmpty());
 }
コード例 #11
0
 public static IEnumerable <IContentNode <T> > Descendants <T>(this IContentNode <T> node) where T : IContent
 {
     return(node.DescendantsInternal());
 }
コード例 #12
0
 public static IEnumerable <IContentNode> Descendants(this IContentNode node)
 {
     return(node.DescendantsInternal());
 }
コード例 #13
0
 public static IEnumerable <IContentNode <T> > Ancestors <T>(this IContentNode <T> node) where T : IContent
 {
     return(node.AncestorsInternal());
 }
コード例 #14
0
 public static IContentNode <T> Root <T>(this IContentNode <T> node) where T : IContent
 {
     return(node.RootInternal());
 }
コード例 #15
0
 public static IEnumerable <IContentNode> Ancestors(this IContentNode node)
 {
     return(node.AncestorsInternal());
 }
コード例 #16
0
ファイル: MustBeList.cs プロジェクト: simplify9/Metadata
        public override IEnumerable <SchemaIssue> FindIssues(IContentNode node)
        {
            var issues = base.FindIssues(node);

            if (issues.Any())
            {
                foreach (var i in issues)
                {
                    yield return(i);
                }
            }
            else
            {
                var list = node as ContentList;



                var itemCount = list.Count();
                if ((MinItemCount != null && MinItemCount.Value > itemCount) ||
                    (MaxItemCount != null && MaxItemCount.Value < itemCount))
                {
                    var sb = new StringBuilder();
                    sb.Append("Must have item count ");
                    if (MinItemCount != null)
                    {
                        sb.Append(">= ");
                        sb.Append(MinItemCount);
                    }

                    if (MaxItemCount != null)
                    {
                        if (MinItemCount != null)
                        {
                            sb.Append("and ");
                        }
                        sb.Append("<= ");
                        sb.Append(MaxItemCount);
                    }

                    sb.Append(", found ");
                    sb.Append(itemCount);
                    sb.Append(" items");
                }
                else
                {
                    var idx = 0;
                    foreach (var item in list)
                    {
                        var index = ContentPath.Root.Append(idx);
                        issues = Item.FindIssues(item);
                        foreach (var issue in issues)
                        {
                            yield return(new SchemaIssue(
                                             index.Append(issue.SubjectPath),
                                             issue.Error));
                        }
                        ++idx;
                    }
                }
            }
        }
コード例 #17
0
 public override bool IsMatch(IContentNode document)
 {
     return(false);
 }
コード例 #18
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="node">节点流内容</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        public override bool Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(false);
            }

            var value = node.GetValue();

            if (value.IsNullOrEmpty)
            {
                return(false);
            }

            if (value.Length == 1)
            {
                return(value[0] == '1');
            }

            if (IsNullValue(value))
            {
                return(false);
            }

            if (value.Length != 4)
            {
                return(false);
            }

            return((value[0] == 't' || value[0] == 'T')
                   & (value[1] == 'r' || value[1] == 'R')
                   & (value[2] == 'u' || value[2] == 'U')
                   & (value[3] == 'e' || value[3] == 'e'));
        }
コード例 #19
0
        public void TestCustomFindTargetReference()
        {
            var nodeContainer = new NodeContainer();
            var instance1     = new ObjectListClass {
                Member1 = 3, Member2 = new List <SimpleClass> {
                    new SimpleClass {
                        Member1 = 1
                    }, new SimpleClass {
                        Member1 = 2
                    }, new SimpleClass {
                        Member1 = 3
                    }
                }
            };
            var instance2 = new ObjectListClass {
                Member1 = 3, Member2 = new List <SimpleClass> {
                    new SimpleClass {
                        Member1 = 2
                    }, new SimpleClass {
                        Member1 = 4
                    }, new SimpleClass {
                        Member1 = 1
                    }
                }
            };
            var source = nodeContainer.GetOrCreateNode(instance1);
            var target = nodeContainer.GetOrCreateNode(instance2);
            var linker = new CustomFindTargetReferenceLinker();

            linker.LinkGraph(source, target);
            // Expected links by index: 0 -> 2, 1 -> 0, 2 -> null
            Index        index           = new Index(0);
            IContentNode tempQualifier   = source[nameof(SimpleClass.Member2)];
            Index        index1          = new Index(2);
            IContentNode tempQualifier1  = target[nameof(SimpleClass.Member2)];
            Index        index2          = new Index(0);
            IContentNode tempQualifier2  = source[nameof(SimpleClass.Member2)];
            Index        index3          = new Index(2);
            IContentNode tempQualifier3  = target[nameof(SimpleClass.Member2)];
            Index        index4          = new Index(0);
            IContentNode tempQualifier4  = source[nameof(SimpleClass.Member2)];
            Index        index5          = new Index(2);
            IContentNode tempQualifier5  = target[nameof(SimpleClass.Member2)];
            Index        index6          = new Index(1);
            IContentNode tempQualifier6  = source[nameof(SimpleClass.Member2)];
            Index        index7          = new Index(0);
            IContentNode tempQualifier7  = target[nameof(SimpleClass.Member2)];
            Index        index8          = new Index(1);
            IContentNode tempQualifier8  = source[nameof(SimpleClass.Member2)];
            Index        index9          = new Index(0);
            IContentNode tempQualifier9  = target[nameof(SimpleClass.Member2)];
            Index        index10         = new Index(1);
            IContentNode tempQualifier10 = source[nameof(SimpleClass.Member2)];
            Index        index11         = new Index(0);
            IContentNode tempQualifier11 = target[nameof(SimpleClass.Member2)];
            Index        index12         = new Index(2);
            IContentNode tempQualifier12 = source[nameof(SimpleClass.Member2)];
            Index        index13         = new Index(2);
            IContentNode tempQualifier13 = source[nameof(SimpleClass.Member2)];
            Index        index14         = new Index(2);
            IContentNode tempQualifier14 = source[nameof(SimpleClass.Member2)];
            var          expectedLinks   = new Dictionary <IContentNode, IContentNode>
            {
                { source, target },
                { source[nameof(SimpleClass.Member1)], target[nameof(SimpleClass.Member1)] },
                { source[nameof(SimpleClass.Member2)], target[nameof(SimpleClass.Member2)] },
                { tempQualifier.IndexedTarget(index), tempQualifier1.IndexedTarget(index1) },
                { tempQualifier2.IndexedTarget(index2)[nameof(SimpleClass.Member1)], tempQualifier3.IndexedTarget(index3)[nameof(SimpleClass.Member1)] },
                { tempQualifier4.IndexedTarget(index4)[nameof(SimpleClass.Member2)], tempQualifier5.IndexedTarget(index5)[nameof(SimpleClass.Member2)] },
                { tempQualifier6.IndexedTarget(index6), tempQualifier7.IndexedTarget(index7) },
                { tempQualifier8.IndexedTarget(index8)[nameof(SimpleClass.Member1)], tempQualifier9.IndexedTarget(index9)[nameof(SimpleClass.Member1)] },
                { tempQualifier10.IndexedTarget(index10)[nameof(SimpleClass.Member2)], tempQualifier11.IndexedTarget(index11)[nameof(SimpleClass.Member2)] },
                { tempQualifier12.IndexedTarget(index12), null },
                { tempQualifier13.IndexedTarget(index13)[nameof(SimpleClass.Member1)], null },
                { tempQualifier14.IndexedTarget(index14)[nameof(SimpleClass.Member2)], null },
            };

            VerifyLinks(expectedLinks, linker);
        }
コード例 #20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GraphNodeChangeListener"/> class.
 /// </summary>
 /// <param name="rootNode">The root node for which to track referenced node changes.</param>
 /// <param name="shouldRegisterNode">A method that can indicate whether a node of the hierarchy should be registered to the listener.</param>
 public GraphNodeChangeListener(IContentNode rootNode, Func <IMemberNode, IContentNode, bool> shouldRegisterNode = null)
 {
     this.rootNode           = rootNode;
     this.shouldRegisterNode = shouldRegisterNode;
     RegisterAllNodes();
 }
コード例 #21
0
 public VirtualNodeCommandWrapper(IViewModelServiceProvider serviceProvider, INodeCommand nodeCommand, IContentNode node, Index index)
     : base(serviceProvider)
 {
     if (nodeCommand == null)
     {
         throw new ArgumentNullException(nameof(nodeCommand));
     }
     if (node == null)
     {
         throw new ArgumentNullException(nameof(node));
     }
     this.node   = node;
     this.index  = index;
     NodeCommand = nodeCommand;
     Service     = serviceProvider.Get <GraphViewModelService>();
 }
コード例 #22
0
        /// <summary>
        /// 在流中读取字节后转换为对象
        /// </summary>
        /// <param name="setting">配置项</param>
        /// <param name="node">节点流内容</param>
        /// <param name="reader">字符读取器</param>
        /// <param name="checkNullValue">是否检查空值</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentOutOfRangeException"></exception>
        /// <exception cref="System.ArgumentNullException"></exception>
        public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue)
        {
            if (node == null)
            {
                return(new DateTime());
            }

            var value = node.GetValue();

            try
            {
                int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, mill = 0;
                if (value.Length > 22)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                    second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]);
                    mill   = GetGigitInZeroToNightChar(value[20]) * 100 + GetGigitInZeroToNightChar(value[21]) * 10 + GetGigitInZeroToNightChar(value[22]);
                }
                else if (value.Length > 18)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                    second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]);
                }
                else if (value.Length > 15)
                {
                    year   = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month  = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day    = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour   = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                    minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]);
                }
                else if (value.Length > 12)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day   = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                    hour  = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]);
                }
                else if (value.Length > 9)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                    day   = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]);
                }
                else if (value.Length > 6)
                {
                    year  = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                    month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]);
                }
                else
                {
                    year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]);
                }
                //year = GetGigitInZeroToNightChar(node.Value[0]) * 1000 + GetGigitInZeroToNightChar(node.Value[1]) * 100 + GetGigitInZeroToNightChar(node.Value[2]) * 10 + GetGigitInZeroToNightChar(node.Value[3]);
                //month = GetGigitInZeroToNightChar(node.Value[5]) * 10 + GetGigitInZeroToNightChar(node.Value[6]);
                //day = GetGigitInZeroToNightChar(node.Value[8]) * 10 + GetGigitInZeroToNightChar(node.Value[9]);
                //hour = GetGigitInZeroToNightChar(node.Value[11]) * 10 + GetGigitInZeroToNightChar(node.Value[12]);
                //minute = GetGigitInZeroToNightChar(node.Value[14]) * 10 + GetGigitInZeroToNightChar(node.Value[15]);
                //second = GetGigitInZeroToNightChar(node.Value[17]) * 10 + GetGigitInZeroToNightChar(node.Value[18]);
                //if (node.Value.Length > 22)
                //    mill = GetGigitInZeroToNightChar(node.Value[20]) * 100 + GetGigitInZeroToNightChar(node.Value[21]) * 10 + GetGigitInZeroToNightChar(node.Value[22]);

                return(new DateTime(year, month, day, hour, minute, second, mill));
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
            catch
            {
                throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString()));
            }
        }
コード例 #23
0
 protected override bool ShouldVisitNode(IMemberNode memberContent, IContentNode targetNode)
 {
     // Make sure it's actually a target (not a member) node.
     return(!propertyGraph.IsReferencedPart(memberContent, targetNode) && base.ShouldVisitNode(memberContent, targetNode));
 }
コード例 #24
0
 public ExpandingEventArgs(IContentNode node, ITreeSettings settings)
 {
     this.Node     = node ?? throw new ArgumentNullException(nameof(node));
     this.Settings = settings ?? throw new ArgumentNullException(nameof(settings));
 }
コード例 #25
0
 public IEnumerable <SchemaIssue> FindIssues(IContentNode node)
 {
     yield break;
 }
コード例 #26
0
 protected override bool ShouldVisitSourceNode(IMemberNode memberContent, IContentNode targetNode)
 {
     return((ShouldVisit?.Invoke(memberContent, targetNode) ?? true) && base.ShouldVisitSourceNode(memberContent, targetNode));
 }
コード例 #27
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GraphViewModel"/> class.
 /// </summary>
 /// <param name="serviceProvider">A service provider that can provide a <see cref="IDispatcherService"/> and an <see cref="GraphViewModelService"/> to use for this view model.</param>
 /// <param name="propertyProvider">The object providing properties to display</param>
 /// <param name="graphNode">The root node of the view model to generate.</param>
 private GraphViewModel(IViewModelServiceProvider serviceProvider, IPropertiesProviderViewModel propertyProvider, IContentNode graphNode)
     : this(serviceProvider)
 {
     if (graphNode == null)
     {
         throw new ArgumentNullException(nameof(graphNode));
     }
     PropertiesProvider = propertyProvider;
     var node = GraphViewModelService.GraphNodeViewModelFactory(this, "Root", graphNode.IsPrimitive, graphNode, new GraphNodePath(graphNode), graphNode.Type, Index.Empty);
     RootNode = node;
     node.Initialize();
     node.FinalizeInitialization();
     node.CheckConsistency();
 }
コード例 #28
0
        protected override IContentNode FindTarget(IContentNode sourceNode)
        {
            var defaultTarget = base.FindTarget(sourceNode);

            return(propertyGraph.FindTarget(sourceNode, defaultTarget));
        }
コード例 #29
0
 public ConstantExpression(IContentNode constant)
 {
     Constant = constant ?? throw new ArgumentNullException(nameof(constant));
 }
コード例 #30
0
        protected override ObjectReference FindTargetReference(IContentNode sourceNode, IContentNode targetNode, ObjectReference sourceReference)
        {
            if (sourceReference.Index.IsEmpty)
            {
                return(targetNode.TargetReference);
            }

            // Special case for objects that are identifiable: the object must be linked to the base only if it has the same id
            if (sourceReference.ObjectValue != null)
            {
                if (sourceReference.Index.IsEmpty)
                {
                    return(targetNode.TargetReference);
                }

                var sourceAssetNode = (IAssetNode)sourceNode;
                if ((sourceAssetNode as AssetMemberNode)?.IsNonIdentifiableCollectionContent ?? false)
                {
                    return(null);
                }

                // Enumerable reference: we look for an object with the same id
                var targetReference = targetNode.ItemReferences;
                var sourceIds       = CollectionItemIdHelper.GetCollectionItemIds(sourceNode.Retrieve());
                var targetIds       = CollectionItemIdHelper.GetCollectionItemIds(targetNode.Retrieve());
                var itemId          = sourceIds[sourceReference.Index.Value];
                var targetKey       = targetIds.GetKey(itemId);
                return(targetReference.FirstOrDefault(x => Equals(x.Index.Value, targetKey)));
            }

            // Not identifiable - default applies
            return(base.FindTargetReference(sourceNode, targetNode, sourceReference));
        }
コード例 #31
0
 internal void RegisterOwner(IContentNode node)
 {
     if (node == null) throw new ArgumentNullException(nameof(node));
     if (OwnerNode != null) throw new InvalidOperationException("An owner node has already been registered for this content.");
     OwnerNode = node;
 }
コード例 #32
0
 /// <summary>
 /// 在流中读取字节后转换为对象
 /// </summary>
 /// <param name="setting">配置项</param>
 /// <param name="reader">字符读取器</param>
 /// <param name="node">节点流内容</param>
 /// <param name="checkNullValue">是否检查空值</param>
 /// <returns></returns>
 public abstract T Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue);