public INode Filter(ref INodeResolver resolver, ref INodeAddress address, ref NodeType nodeType, out bool canCache) { if (nodeType.GetType().IsGenericType&& nodeType.GetType().GetGenericTypeDefinition() == typeof(DataFileNodeType <>)) { var innerNodeType = nodeType.InnerType ?? NodeType.File; var file = (IFile)resolver.Resolve(address.PathAndQuery, innerNodeType); var dataFileType = typeof(DataFile <>); dataFileType = dataFileType.MakeGenericType(nodeType.GetType().GetGenericArguments()); var dataFile = (INode)Activator.CreateInstance(dataFileType, file, nodeType); canCache = true; return(dataFile); } else { canCache = false; return(null); } }
public INode Filter(ref INodeResolver resolver, ref INodeAddress address, ref NodeType nodeType, out bool canCache) { if (nodeType.GetType().IsGenericType && nodeType.GetType().GetGenericTypeDefinition() == typeof(DataFileNodeType<>)) { var innerNodeType = nodeType.InnerType ?? NodeType.File; var file = (IFile)resolver.Resolve(address.PathAndQuery, innerNodeType); var dataFileType = typeof(DataFile<>); dataFileType = dataFileType.MakeGenericType(nodeType.GetType().GetGenericArguments()); var dataFile = (INode)Activator.CreateInstance(dataFileType, file, nodeType); canCache = true; return dataFile; } else { canCache = false; return null; } }
public override ICollection <Type> GetKnownTypes([Optional] Container container) { Console.WriteLine("Expression Node KnownType"); return(new Type [] { Type?.FromNode(container), this.GetType(), NodeType.GetType() }); }
public void Add(NodeType nodeType) { if (null == nodeType) { throw new ArgumentNullException("nodeType"); } // Open subschema if (SubSchemas.ContainsKey(nodeType.Id)) { throw new InvalidTypeException(nodeType.Id, "Node type definition already loaded."); } var subSchema = SubSchemas[nodeType.Id] = new SubSchema(); // Find all instance fields on DomainType Type type = nodeType.GetType(); var fields = type.GetFields(); foreach (var field in fields) { // Check if the field is a PropertyType var propertyType = field.GetValue(nodeType) as PropertyType; if (null != propertyType) { if (subSchema.Properties.ContainsKey(propertyType.Key)) { throw new InvalidKeyException(nodeType.Id, propertyType.Key, "Key already defined."); } subSchema.Properties[propertyType.Key] = propertyType; // Gettables foreach (var item in propertyType.GroupsRead) { subSchema.GetGroupAccess(item.Id).GettableProperties.Add(propertyType.Key); } // Settables foreach (var item in propertyType.GroupsWrite) { subSchema.GetGroupAccess(item.Id).SettableProperties.Add(propertyType.Key); } } // Check if the field is a LinkType var linkType = field.GetValue(nodeType) as LinkType; if (null != linkType) { if (subSchema.Links.ContainsKey(linkType.Key)) { throw new InvalidKeyException(nodeType.Id, linkType.Key, "Key already defined."); } subSchema.Links[linkType.Key] = linkType; // Gettables foreach (var item in linkType.GroupsRead) { subSchema.GetGroupAccess(item.Id).GettableLinks.Add(linkType.Key); } // Settables foreach (var item in linkType.GroupsWrite) { subSchema.GetGroupAccess(item.Id).SettableLinks.Add(linkType.Key); } } } // CanDelete foreach (var item in nodeType.CanDelete) { subSchema.GetGroupAccess(item.Id).CanDelete = true; } Loaded = true; }