private IJsonMetadata GetMetadata(IMetadataBuilderContext context, MetadataIdentity identity) { MetadataIdentity parentIdentity = identity.Parent(); IJsonMetadata parent = context.GetMetadata <IJsonMetadata>(parentIdentity.Name) ?? this.GetMetadata(context, parentIdentity); IRelationMetadata relation = identity.GetMetadata <IRelationMetadata>(); if (parent == null || relation == null) { return(null); } JsonMetadata metadata = new JsonMetadata(relation); if (this.HasJsonAttribute(relation) || relation.HasFlag(RelationMetadataFlags.Item)) { metadata.MemberOf = metadata; metadata.IsRoot = true; metadata.Path = "$"; } else { metadata.MemberOf = parent.MemberOf; metadata.IsRoot = false; metadata.Path = $"{parent.Path}.{this.GetPropertyNameFromContract(metadata)}"; } context.AddMetadata <IJsonMetadata>(metadata); return(metadata); }
private IBindingMetadata FindDynamicMetadata(MetadataIdentity identity) { IBindingMetadata metadata = identity.GetMetadata <IBindingMetadata>(); while (metadata == null && (identity = identity.Pop()) != null) { metadata = identity.GetMetadata <IBindingMetadata>(); } if (metadata != null && metadata.HasFlag(BindingMetadataFlags.Dynamic)) { return(metadata); } return(null); }
public ItemBuilder(RelationIdentity relation, MetadataIdentity source) { this.relation = relation ?? throw new ArgumentNullException(nameof(relation)); this.sourceMetadata = source.GetMetadata <IRelationMetadata>(); this.headingMetadata = relation.Heading.Select(m => m.GetMetadata <IRelationMetadata>()).ToArray(); this.Validate(); }
private void AddValueNode(List <MetadataNode> itemNodes, ColumnIdentity value) { MetadataIdentity identity = new MetadataIdentity(this.schema, value.Name); IBindingMetadata metadata = identity.GetMetadata <IBindingMetadata>() ?? this.FindDynamicMetadata(identity); if (metadata != null && !this.IsOutsideResultScope(metadata)) { if (metadata.HasFlag(BindingMetadataFlags.Dynamic)) { this.AddDynamicNode(itemNodes, identity, metadata, value); } else { this.AddStaticNode(itemNodes, metadata, value); } } }
private static Action <IField, object> BuildFieldBinder(MetadataIdentity metadata, ColumnIdentity column) { ParameterExpression fieldParam = Expression.Parameter(typeof(IField)); ParameterExpression valueParam = Expression.Parameter(typeof(object)); IBindingMetadata binding = metadata.GetMetadata <IBindingMetadata>(); Expression bindValue = valueParam; if (metadata != null) { Type sourceType = null; if (column != null) { BindingColumnInfo columnInfo = new BindingColumnInfo() { Column = column, CanBeNull = true, Metadata = binding, }; sourceType = binding.Value?.Read(columnInfo)?.ReturnType; } BindingValueInfo valueInfo = new BindingValueInfo() { CanBeNull = true, CanBeDbNull = true, Metadata = binding, Value = bindValue, SourceType = sourceType, TargetType = binding.Type, }; bindValue = binding.Value?.Convert?.Invoke(valueInfo) ?? valueParam; } MethodInfo bindMethod = typeof(IField).GetMethod(nameof(IField.Bind), new[] { typeof(object) }); Expression bindCall = Expression.Call(fieldParam, bindMethod, Expression.Convert(bindValue, typeof(object))); return(Expression.Lambda <Action <IField, object> >(bindCall, fieldParam, valueParam).Compile()); }