public XPathTypeNode GetNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context)
        {
            if ((parent==null) && (memberInfo==null))
                return GetRootNode(node, context);

            return new XPathQueryableNode(node, memberInfo, parent, context);
        }
Пример #2
0
        public XPathTypeNode Copy(XPathTypeContext context)
        {
            XPathTypeNode ret = Clone();

            ret._Context = context;
            return(ret);
        }
Пример #3
0
        internal XPathTypeNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context)
        {
            Debug.Assert(context!=null);
            if (context==null)
                throw new ArgumentNullException("context");
            Debug.Assert(node!=null);
            if (node==null)
                throw new ArgumentNullException("node");

            _Node=node;
            _MemberInfo=memberInfo;
            _Parent=parent;
            _Context=context;

            // Initialize optional external metadata holding types
            foreach (MetadataTypeAttribute mta in node.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
                _MetadataNodes=new Type[] { node, mta.MetadataClassType };
            if (_MetadataNodes==null)
                _MetadataNodes=new Type[] { node };

            if (memberInfo!=null)
            {
                if (parent!=null)
                    _MetadataMemberInfos=parent.MetadataNodes
                        .SelectMany<Type, MemberInfo>(t => t.GetMember(memberInfo.Name, memberInfo.MemberType, BindingFlags.Instance | BindingFlags.Public))
                        .ToArray<MemberInfo>();
                else
                    _MetadataMemberInfos=new MemberInfo[] { memberInfo };
            }
        }
Пример #4
0
        /// <summary>Creates an <see cref="Expression" /> from the current node and the specified <paramref name="parameter" />.</summary>
        /// <param name="parameter">A parameter that represents an instance of the root node, which is the furthest <see cref="Parent" /> from the current node.</param>
        /// <param name="expectedType">The type that the returned expression is expected to represent.</param>
        /// <param name="expressionCreator">A custom function that should be applied to the returned expression.</param>
        /// <returns>The expression that gives access to the current node.</returns>
        public Expression CreateExpression(ParameterExpression parameter, Type expectedType = null, Func <Expression, ParameterExpression, Expression> expressionCreator = null)
        {
            LinkedList <XPathTypeNode> path = GetNodePath();

            path.RemoveFirst(); // This is the root, represented by the parameter

            XPathTypeNode node = path.First.Value;

            path.RemoveFirst();
            return(node.CreateNodeExpression(parameter, path, expectedType, expressionCreator, new Stack <ParameterExpression>()));
        }
Пример #5
0
        internal protected override Expression CreateNodeExpression(Expression baseExpression, LinkedList <XPathTypeNode> path, Type expectedType, Func <Expression, ParameterExpression, Expression> expressionCreator, Stack <ParameterExpression> innerParams)
        {
            Expression          enuex = Expression.PropertyOrField(baseExpression, MemberInfo.Name);
            LambdaExpression    oplex = null;
            ParameterExpression param = Expression.Parameter(Type);

            if (path.First == null)
            {
                if ((expressionCreator == null) && (innerParams.Count > 0))
                {
                    throw new InvalidOperationException("Trying to create an expression to an element that is inside a collection.");
                }

                Expression select = (expressionCreator != null ? param : baseExpression);
                if (ValueMemberInfo != null)
                {
                    select = Expression.PropertyOrField(param, ValueMemberInfo.Name);
                }

                //select=GetSynonymExpression((MemberExpression)select, expectedType);

                // We only want an expression to the collection
                if (expressionCreator == null)
                {
                    return(select);
                }

                oplex = Expression.Lambda(expressionCreator(select, param), param);
            }
            else
            {
                innerParams.Push(param);

                XPathTypeNode node = path.First.Value;
                path.RemoveFirst();

                oplex = Expression.Lambda(node.CreateNodeExpression(param, path, expectedType, expressionCreator, innerParams), param);
            }

            return(Expression.Call(
                       typeof(Enumerable),
                       "Any",
                       new Type[] { Type },
                       enuex,
                       oplex
                       ));
        }
Пример #6
0
        public virtual XPathTypeNode Clone()
        {
            var ret = new XPathTypeNode();

            ret._AttributeChildrenNodes = AttributeChildrenNodes;
            ret._Context = _Context;
            ret._ElementChildrenNodes = ElementChildrenNodes;
            ret._IgnoredChildrenNodes = IgnoredChildrenNodes;
            ret._MemberInfo           = _MemberInfo;
            ret._MetadataMemberInfos  = _MetadataMemberInfos;
            ret._MetadataNodes        = _MetadataNodes;
            ret._Node            = _Node;
            ret._NodeAttributes  = NodeAttributes.ToList <Attribute>();
            ret._Parent          = _Parent;
            ret._ValueMemberInfo = ValueMemberInfo;

            return(ret);
        }
Пример #7
0
        internal XPathTypeNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context)
        {
            Debug.Assert(context != null);
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            Debug.Assert(node != null);
            if (node == null)
            {
                throw new ArgumentNullException("node");
            }

            _Node       = node;
            _MemberInfo = memberInfo;
            _Parent     = parent;
            _Context    = context;

            // Initialize optional external metadata holding types
            foreach (MetadataTypeAttribute mta in node.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
            {
                _MetadataNodes = new Type[] { node, mta.MetadataClassType }
            }
            ;
            if (_MetadataNodes == null)
            {
                _MetadataNodes = new Type[] { node }
            }
            ;

            if (memberInfo != null)
            {
                if (parent != null)
                {
                    _MetadataMemberInfos = parent.MetadataNodes
                                           .SelectMany <Type, MemberInfo>(t => t.GetMember(memberInfo.Name, memberInfo.MemberType, BindingFlags.Instance | BindingFlags.Public))
                                           .ToArray <MemberInfo>();
                }
                else
                {
                    _MetadataMemberInfos = new MemberInfo[] { memberInfo }
                };
            }
        }
Пример #8
0
        public XPathTypeNode GetNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context)
        {
            if ((parent==null) && (memberInfo==null))
                return GetRootNode(node, context);

            if (node!=typeof(string)) // string implements IEnumerable<char>
            {
                Type entype=node.GetInterface("IEnumerable`1");
                if (entype!=null)
                {
                    Debug.Assert(entype.IsGenericType);

                    Type[] intypes=entype.GetGenericArguments();
                    Debug.Assert(intypes.Length==1);

                    return new XPathTypeEnumerableNode(intypes[0], memberInfo, parent, context);
                }
            }

            return new XPathTypeNode(node, memberInfo, parent, context);
        }
Пример #9
0
        public XPathTypeNode GetNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context)
        {
            if ((parent == null) && (memberInfo == null))
            {
                return(GetRootNode(node, context));
            }

            if (node != typeof(string)) // string implements IEnumerable<char>
            {
                Type entype = node.GetInterface("IEnumerable`1");
                if (entype != null)
                {
                    Debug.Assert(entype.IsGenericType);

                    Type[] intypes = entype.GetGenericArguments();
                    Debug.Assert(intypes.Length == 1);

                    return(new XPathTypeEnumerableNode(intypes[0], memberInfo, parent, context));
                }
            }

            return(new XPathTypeNode(node, memberInfo, parent, context));
        }
Пример #10
0
        internal protected virtual Expression CreateNodeExpression(Expression baseExpression, LinkedList <XPathTypeNode> path, Type expectedType, Func <Expression, ParameterExpression, Expression> expressionCreator, Stack <ParameterExpression> innerParams)
        {
            Expression ret = Expression.PropertyOrField(baseExpression, MemberInfo.Name);

            if (path.First == null)
            {
                if (ValueMemberInfo != null)
                {
                    ret = Expression.PropertyOrField(ret, ValueMemberInfo.Name);
                }

                ret = GetSynonymExpression((MemberExpression)ret, expectedType);

                if ((expressionCreator == null) && (innerParams.Count > 0))
                {
                    throw new InvalidOperationException("Trying to create an expression to an element that is inside a collection.");
                }

                ParameterExpression p = null;
                if (innerParams.Count > 0)
                {
                    p = innerParams.Pop();
                }

                if (expressionCreator != null)
                {
                    return(expressionCreator(ret, p));
                }

                return(ret);
            }

            XPathTypeNode node = path.First.Value;

            path.RemoveFirst();
            return(node.CreateNodeExpression(ret, path, expectedType, expressionCreator, innerParams));
        }
Пример #11
0
 internal void MoveTo(XPathTypeNode node)
 {
     _Current=node;
 }
Пример #12
0
        protected virtual void GetChildren()
        {
            if ((_AttributeChildrenNodes==null) || (_ElementChildrenNodes==null) || (_IgnoredChildrenNodes==null))
            {
                // Attributes simple types dont't have children nodes
                if (
                    (NodeType==XmlNodeType.Attribute) ||
                    (Type.GetTypeCode(_Node)!=TypeCode.Object)
                )
                {
                    _AttributeChildrenNodes=new XPathTypeNode[0];
                    _ElementChildrenNodes=new XPathTypeNode[0];
                    _IgnoredChildrenNodes=new XPathTypeNode[0];
                    return;
                }

                var ac=new List<XPathTypeNode>();
                var ec=new List<XPathTypeNode>();
                var ic=new List<XPathTypeNode>();

                foreach (MemberInfo mi in _Node.GetMembers(BindingFlags.Instance | BindingFlags.Public))
                {
                    Type type=GetMemberType(mi);
                    if (type==null)
                        continue;

                    XPathTypeNode node=_Context.NodeProvider.GetNode(type, mi, this, _Context);

                    // XmlIgnore ?
                    if (node.NodeAttributes.Any<Attribute>(a => a is XmlIgnoreAttribute))
                    {
                        ic.Add(node);
                        continue;
                    }

                    // XmlText ?
                    if (node.NodeAttributes.Any<Attribute>(a => a is XmlTextAttribute))
                    {
                        _ValueMemberInfo=mi;
                        continue;
                    }

                    switch (node.NodeType)
                    {
                    case XmlNodeType.Attribute:
                        ac.Add(node);
                        break;
                    case XmlNodeType.Element:
                        ec.Add(node);
                        break;
                    }
                }

                _AttributeChildrenNodes=ac.ToArray<XPathTypeNode>();
                _ElementChildrenNodes=ec.OrderBy<XPathTypeNode, int>(n => n.Order).ToArray<XPathTypeNode>();
                _IgnoredChildrenNodes=ic.ToArray<XPathTypeNode>();
            }
        }
Пример #13
0
 /// <summary>Creates a new instance of the <see cref="XPathTypeRootNode" /> class that will act as a root node.</summary>
 /// <param name="root"></param>
 /// <param name="context"></param>
 internal protected XPathTypeRootNode(Type root, XPathTypeContext context):
     base(root, context)
 {
     _ElementChildrenNodes=new XPathTypeNode[] { context.NodeProvider.GetNode(Node, null, this, Context) };
 }
Пример #14
0
 internal XPathTypeEnumerableNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context) :
     base(node, memberInfo, parent, context)
 {
 }
Пример #15
0
        protected virtual void GetChildren()
        {
            if ((_AttributeChildrenNodes == null) || (_ElementChildrenNodes == null) || (_IgnoredChildrenNodes == null))
            {
                // Attributes simple types dont't have children nodes
                if (
                    (NodeType == XmlNodeType.Attribute) ||
                    (Type.GetTypeCode(_Node) != TypeCode.Object)
                    )
                {
                    _AttributeChildrenNodes = new XPathTypeNode[0];
                    _ElementChildrenNodes   = new XPathTypeNode[0];
                    _IgnoredChildrenNodes   = new XPathTypeNode[0];
                    return;
                }

                var ac = new List <XPathTypeNode>();
                var ec = new List <XPathTypeNode>();
                var ic = new List <XPathTypeNode>();

                foreach (MemberInfo mi in _Node.GetMembers(BindingFlags.Instance | BindingFlags.Public))
                {
                    Type type = GetMemberType(mi);
                    if (type == null)
                    {
                        continue;
                    }

                    XPathTypeNode node = _Context.NodeProvider.GetNode(type, mi, this, _Context);

                    // XmlIgnore ?
                    if (node.NodeAttributes.Any <Attribute>(a => a is XmlIgnoreAttribute))
                    {
                        ic.Add(node);
                        continue;
                    }

                    // XmlText ?
                    if (node.NodeAttributes.Any <Attribute>(a => a is XmlTextAttribute))
                    {
                        _ValueMemberInfo = mi;
                        continue;
                    }

                    switch (node.NodeType)
                    {
                    case XmlNodeType.Attribute:
                        ac.Add(node);
                        break;

                    case XmlNodeType.Element:
                        ec.Add(node);
                        break;
                    }
                }

                _AttributeChildrenNodes = ac.ToArray <XPathTypeNode>();
                _ElementChildrenNodes   = ec.OrderBy <XPathTypeNode, int>(n => n.Order).ToArray <XPathTypeNode>();
                _IgnoredChildrenNodes   = ic.ToArray <XPathTypeNode>();
            }
        }
Пример #16
0
 internal void MoveTo(XPathTypeNode node)
 {
     _Current = node;
 }
Пример #17
0
 /// <summary>Creates a new instance of the <see cref="XPathTypeRootNode" /> class that will act as a root node.</summary>
 /// <param name="root"></param>
 /// <param name="context"></param>
 internal protected XPathTypeRootNode(Type root, XPathTypeContext context) :
     base(root, context)
 {
     _ElementChildrenNodes = new XPathTypeNode[] { context.NodeProvider.GetNode(Node, null, this, Context) };
 }
Пример #18
0
 internal XPathTypeEnumerableNode(Type node, MemberInfo memberInfo, XPathTypeNode parent, XPathTypeContext context):
     base(node, memberInfo, parent, context)
 {
 }
Пример #19
0
        public virtual XPathTypeNode Clone()
        {
            var ret=new XPathTypeNode();

            ret._AttributeChildrenNodes=AttributeChildrenNodes;
            ret._Context=_Context;
            ret._ElementChildrenNodes=ElementChildrenNodes;
            ret._IgnoredChildrenNodes=IgnoredChildrenNodes;
            ret._MemberInfo=_MemberInfo;
            ret._MetadataMemberInfos=_MetadataMemberInfos;
            ret._MetadataNodes=_MetadataNodes;
            ret._Node=_Node;
            ret._NodeAttributes=NodeAttributes.ToList<Attribute>();
            ret._Parent=_Parent;
            ret._ValueMemberInfo=ValueMemberInfo;

            return ret;
        }