using System.Reflection; namespace Egw.Core { public class Utils { /// /// Effettua salvataggio in file di un generico oggetto in formato CSV /// /// /// /// /// Separatore da impiegare /// public static async Task SaveToCsv(List 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(); // 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); } } }