38 lines
1.4 KiB
C#
38 lines
1.4 KiB
C#
using System.Reflection;
|
|
|
|
namespace Egw.Core
|
|
{
|
|
public class Utils
|
|
{
|
|
/// <summary>
|
|
/// Effettua salvataggio in file di un generico oggetto in formato CSV
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="reportData"></param>
|
|
/// <param name="path"></param>
|
|
/// <param name="separator">Separatore da impiegare</param>
|
|
/// <returns></returns>
|
|
public static async Task SaveToCsv<T>(List<T> reportData, string path, char separator)
|
|
{
|
|
// 1. Recuperiamo le proprietà del tipo T una sola volta (Risolve i problemi di performance)
|
|
PropertyInfo[] properties = typeof(T).GetProperties();
|
|
|
|
var lines = new List<string>();
|
|
|
|
// 2. Creiamo l'header usando il separatore corretto (Risolve il bug del ";" fisso)
|
|
var header = string.Join(separator, properties.Select(p => p.Name));
|
|
lines.Add(header);
|
|
|
|
// 3. Estraiamo i valori gestendo i possibili null (Risolve il tuo warning)
|
|
var valueLines = reportData
|
|
.Where(row => row != null)
|
|
.Select(row => string.Join(separator, properties.Select(p => p.GetValue(row)?.ToString() ?? string.Empty)));
|
|
|
|
lines.AddRange(valueLines);
|
|
|
|
// 4. Utilizziamo il metodo di scrittura asincrono nativo di .NET
|
|
await File.WriteAllLinesAsync(path, lines);
|
|
}
|
|
}
|
|
}
|