Я использую csvhelper, чтобы попытаться экспортировать коллекцию элементов, которая содержит вложенный словарь, в csv.
Мне также нужно изменить имена заголовков в зависимости от текущей культуры. Мне удалось выполнить перевод заголовка с помощью сопоставления, показанного ниже, поэтому я должен иметь возможность сохранить эту функциональность, в то же время поддерживая вложенный словарь.
CultureInfo currentCulture = localeCode == null ? CultureInfo.CurrentCulture : new CultureInfo(localeCode);
var rm = new ResourceManager("fileName", Assembly.GetExecutingAssembly());
Map(m => m.Id).Name(rm.GetString("Id", currentCulture));
Map(m => m.Name).Name(rm.GetString("Name", currentCulture));
Я пытался использовать ExpandoObjects, и это, похоже,работать, однако мне интересно, есть ли более элегантное решение.
// distinct list of all keys in the dictionary
var customAttributeNames = collection.SelectMany(c => c.CustomAttributes.Keys).Distinct().ToList();
var records = new List<dynamic>();
foreach (var item in collection)
{
IDictionary<string, object> record = new ExpandoObject();
record["Id"] = item.Id;
record["Name"] = item.Name;
// This is the nested dictionary
foreach (var name in customAttributeNames)
{
item.CustomAttributes.TryGetValue(name, out var value);
record.Add(name, value);
}
records.Add(record);
}
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer))
{
csv.WriteRecords(records);
}