Szukałem rozwiązania tego problemu, ale żadna z odpowiedzi, które znalazłem, nie zaspokajała mojej motywacji do prostoty. Zdałem sobie sprawę, że mam już odpowiedź z mojego automatycznego kodu CRUD. I repurposed go i wpadł na następujący kod:
using System.Reflection;
/// <summary>
/// Using a bit of reflection to build up the strings.
/// </summary>
public static string ToCsvHeader(this object obj)
{
Type type = obj.GetType();
var properties = type.GetProperties(BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Instance);
string result = string.Empty;
Array.ForEach(properties, prop =>
{
result += prop.Name + ",";
});
return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result);
}
public static string ToCsvRow(this object obj)
{
Type type = obj.GetType();
var properties = type.GetProperties(BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Instance);
string result = string.Empty;
Array.ForEach(properties, prop =>
{
var value = prop.GetValue(obj, null);
var propertyType = prop.PropertyType.FullName;
if (propertyType == "System.String")
{
// wrap value incase of commas
value = "\"" + value + "\"";
}
result += value + ",";
});
return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result);
}
Byłoby dodać metodę rozszerzenia do każdego obiektu. Sposób użycia:
var burgers = new List<Cheeseburger>();
var output = burgers.ToCsvHeader();
output += Environment.NewLine;
burgers.ForEach(burger =>
{
output += burger.ToCsvRow();
output += Environment.NewLine;
});
var path = "[where ever you want]";
System.IO.File.WriteAllText(path, output);
Prawdopodobnie jest lepszy sposób na zapisanie tych dwóch metod powyżej, ale działa to idealnie w mojej sytuacji. Mam nadzieję, że to komuś pomaga.
Czy jesteś w stanie to zrobić? Którego próbowałeś? – Praveen