This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// Formatter to generate csv | |
/// </summary> | |
public class CsvMediaTypeFormatter : TextOutputFormatter | |
{ | |
/// <summary> | |
/// CSV Formatter | |
/// </summary> | |
public CsvMediaTypeFormatter() | |
{ | |
SupportedMediaTypes.Add(Microsoft.Net.Http.Headers.MediaTypeHeaderValue.Parse("text/csv")); | |
SupportedEncodings.Add(Encoding.UTF8); | |
SupportedEncodings.Add(Encoding.Unicode); | |
} | |
/// <summary> | |
/// Write the response | |
/// </summary> | |
/// <param name="context"></param> | |
/// <param name="selectedEncoding"></param> | |
/// <returns></returns> | |
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) | |
{ | |
StringBuilder csv = new StringBuilder(); | |
Type type = GetTypeOf(context.Object); | |
csv.AppendLine( | |
string.Join<string>( | |
",", type.GetProperties().Select(x => x.Name) | |
) | |
); | |
foreach (var obj in (IEnumerable<object>)context.Object) | |
{ | |
var vals = obj.GetType().GetProperties().Select( | |
pi => new | |
{ | |
Value = pi.GetValue(obj, null) | |
} | |
); | |
List<string> values = new List<string>(); | |
foreach (var val in vals) | |
{ | |
if (val.Value != null) | |
{ | |
var tmpval = val.Value.ToString(); | |
//Check if the value contans a comma and place it in quotes if so | |
if (tmpval.Contains(",")) | |
tmpval = string.Concat("\"", tmpval, "\""); | |
//Replace any \r or \n special characters from a new line with a space | |
tmpval = tmpval.Replace("\r", " ", StringComparison.InvariantCultureIgnoreCase); | |
tmpval = tmpval.Replace("\n", " ", StringComparison.InvariantCultureIgnoreCase); | |
values.Add(tmpval); | |
} | |
else | |
{ | |
values.Add(string.Empty); | |
} | |
} | |
csv.AppendLine(string.Join(",", values)); | |
} | |
return context.HttpContext.Response.WriteAsync(csv.ToString(), selectedEncoding); | |
} | |
private static Type GetTypeOf(object obj) | |
{ | |
Type type = obj.GetType(); | |
Type itemType; | |
if (type.GetGenericArguments().Length > 0) | |
{ | |
itemType = type.GetGenericArguments()[0]; | |
} | |
else | |
{ | |
itemType = type.GetElementType(); | |
} | |
return itemType; | |
} | |
protected override bool CanWriteType(Type type) | |
{ | |
return typeof(IEnumerable).IsAssignableFrom(type); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment