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); }
/// <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); } } }