예제 #1
0
        private IExpressionNode GetResourceMember(IExpressionNode node, string memberName, IList <IExpressionNode> nodes)
        {
            IExpressionNode staticValue;

            if (_staticNodes.TryGetValue(node, out staticValue))
            {
                return(staticValue);
            }

            IBindingPath path        = BindingPath.Create(memberName);
            string       firstMember = path.Parts[0];
            Type         type        = BindingServiceProvider.ResourceResolver.ResolveType(firstMember, DataContext.Empty, false);
            var          dynMember   = (ResourceExpressionNode)nodes[0];

            if (dynMember.Dynamic && type == null)
            {
                memberName = BindingExtensions.MergePath(path.Parts.Skip(1).ToArray());
                return(GetOrAddBindingMember("$" + path.Path, (s, i) => new BindingMemberExpressionNode(firstMember, memberName, s, i)));
            }

            bool            dynamicMember   = false;
            IExpressionNode firstMemberNode = nodes[1];

            if (!_staticNodes.TryGetValue(firstMemberNode, out staticValue))
            {
                if (type == null)
                {
                    IBindingResourceObject resourceObject = BindingServiceProvider
                                                            .ResourceResolver
                                                            .ResolveObject(firstMember, DataContext.Empty, true);
                    var dynamicObject = resourceObject.Value as IDynamicObject;
                    if (dynamicObject == null || path.Parts.Count <= 1)
                    {
                        staticValue = new ConstantExpressionNode(resourceObject.Value, resourceObject.Type);
                    }
                    else
                    {
                        staticValue   = new ConstantExpressionNode(dynamicObject.GetMember(path.Parts[1], Empty.Array <object>()));
                        dynamicMember = true;
                    }
                }
                else
                {
                    staticValue = new ConstantExpressionNode(type, typeof(Type));
                }
                _staticNodes[firstMemberNode] = staticValue;
                if (dynamicMember)
                {
                    _staticNodes[nodes[2]] = staticValue;
                }
            }
            if (firstMemberNode == node || (dynamicMember && node == nodes[2]))
            {
                return(staticValue);
            }
            return(node);
        }
예제 #2
0
 /// <summary>
 ///     Adds the specified object.
 /// </summary>
 public virtual void AddObject(string name, IBindingResourceObject obj, bool rewrite)
 {
     Should.NotBeNullOrWhitespace(name, "name");
     Should.NotBeNull(obj, "obj");
     lock (_objects)
     {
         if (rewrite)
         {
             _objects[name] = obj;
         }
         else
         {
             _objects.Add(name, obj);
         }
     }
 }