public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext) { var attributes = value.GetType().GetCustomAttributes(true); if (attributes.Any(x => x is HalResourceAttribute)) { var result = new HalJsonResource(value); return base.WriteToStreamAsync(result.GetType(), result, stream, contentHeaders, transportContext); } else if (attributes.Any(x => x is HalResourceCollectionAttribute)) { var results = new HalJsonResourceCollection(value); return base.WriteToStreamAsync(results.GetType(), results, stream, contentHeaders, transportContext); } else if (value.GetType().IsArray) { var values = value as object[]; var items = new HalJsonResource[values.Length]; for (int i = 0; i < items.Length; i++) { IEnumerable<HalLink> halLinks = null; var lp = value.GetType().GetProperty("Links"); if (lp != null) { halLinks = lp.GetValue(value) as IEnumerable<HalLink>; } items[i] = new HalJsonResource(values[i]); } return base.WriteToStreamAsync(items.GetType(), items, stream, contentHeaders, transportContext); } return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext); }
public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext) { var attributes = value.GetType().GetCustomAttributes(true); if (attributes.Any(x => x is HalResourceCollectionAttribute || x is HalResourceAttribute)) { IEnumerable<HalLink> halLinks = null; var lpName = "Links"; var lp = value.GetType().GetProperties().Where(x => x.GetCustomAttributes(true).Any(x2 => x2 is HalLinksAttribute)).FirstOrDefault(); if (lp == null) lp = value.GetType().GetProperty(lpName); if (lp != null) halLinks = lp.GetValue(value) as IEnumerable<HalLink>; lpName = lp != null ? lp.Name : lpName; if (attributes.Any(x => x is HalResourceCollectionAttribute)) { PropertyInfo collectionProperty; collectionProperty = value.GetType().GetProperties().Where(x => x.GetCustomAttributes(true).Any(x2 => x2 is HalEmbeddedResourceCollectionAttribute)).FirstOrDefault(); if (collectionProperty == null) { //find first property that is IEnumerable to use as the collection (skip Links) collectionProperty = value.GetType().GetProperties().Where(x => x.Name != lpName && x.PropertyType.GetInterface("IEnumerable") != null).FirstOrDefault(); if (collectionProperty == null) throw new Exception("couldn't find a usable property for the resource collection"); } var collection = collectionProperty.GetValue(value) as IEnumerable<object>; var results = new HalJsonResourceCollection(halLinks, collection, collectionProperty); return base.WriteToStreamAsync(results.GetType(), results, stream, contentHeaders, transportContext); } else { var result = new HalJsonResource(value); return base.WriteToStreamAsync(result.GetType(), result, stream, contentHeaders, transportContext); } } else if (value.GetType().IsArray) { var values = value as object[]; var items = new HalJsonResource[values.Length]; for (int i = 0; i < items.Length; i++) { IEnumerable<HalLink> halLinks = null; var lp = value.GetType().GetProperty("Links"); if (lp != null) { halLinks = lp.GetValue(value) as IEnumerable<HalLink>; } items[i] = new HalJsonResource(values[i]); } return base.WriteToStreamAsync(items.GetType(), items, stream, contentHeaders, transportContext); } return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext); }
public override System.Threading.Tasks.Task WriteToStreamAsync(Type type, object value, System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext) { var attributes = value.GetType().GetCustomAttributes(true); if (attributes.Any(x => x is HalResourceAttribute)) { var result = new HalJsonResource(value); return(base.WriteToStreamAsync(result.GetType(), result, stream, contentHeaders, transportContext)); } else if (attributes.Any(x => x is HalResourceCollectionAttribute)) { var results = new HalJsonResourceCollection(value); return(base.WriteToStreamAsync(results.GetType(), results, stream, contentHeaders, transportContext)); } else if (value.GetType().IsArray) { var values = value as object[]; var items = new HalJsonResource[values.Length]; for (int i = 0; i < items.Length; i++) { IEnumerable <HalLink> halLinks = null; var lp = value.GetType().GetProperty("Links"); if (lp != null) { halLinks = lp.GetValue(value) as IEnumerable <HalLink>; } items[i] = new HalJsonResource(values[i]); } return(base.WriteToStreamAsync(items.GetType(), items, stream, contentHeaders, transportContext)); } return(base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext)); }