2014-09-27 1 views
3

Я надеялся использовать динамически типизированный объект для записи в файл CSV.Как вы используете CsvHelper для записи класса, полученного из DynamicObject?

Я получаю «CsvHelper.CsvWriterException» в методе CsvWriter.WriteObject с этим сообщением: «Никакие свойства не отображаются для типа« WpmExport.DynamicEntry ».»

Вот класс, который я пытаюсь использовать:

public class DynamicEntry : DynamicObject 
{ 
    private Dictionary<string, object> dictionary = new Dictionary<string, object>(); 

    public override bool TryGetMember(
     GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name.ToLower(); 
     return dictionary.TryGetValue(name, out result); 
    } 

    public override bool TrySetMember(
     SetMemberBinder binder, object value) 
    { 
     dictionary[binder.Name.ToLower()] = value; 
     return true; 
    } 

    public override IEnumerable<string> GetDynamicMemberNames() 
    { 
     return dictionary.Keys.AsEnumerable(); 
    } 
} 

Любой с любыми идеями или рабочими примерами? В документации по адресу http://joshclose.github.io/CsvHelper/ намекает, что это возможно, но не дает никаких указаний.

TIA

ответ

3

Функциональность еще не существует. Вы можете написать dynamic, но не DynamicObject. Вы можете посмотреть тему на эту тему. https://github.com/JoshClose/CsvHelper/issues/187

Когда функциональность будет реализована, я буду обновлять ответ с версией это в.

Update

Эта функция будет доступна в версии 3.0. Вы можете попробовать 3.0-бета от NuGet.

2

Поскольку я не могу дождаться версии 3.0 (и CsvHelper.Excel для ее поддержки), я нашел временное решение.

Есть класс для экспорта:

public partial class EntryReportInventory 
{ 
    public Guid DeviceId { get; set; } 
    [ReportProperty] 
    public string DeviceName { get; set; } 

    public Dictionary<string, object> InventoryValues { get; set; } 

    public EntryReportInventory(Device device, Dictionary<string, object> inventoryValues) 
    { 
     this.DeviceId = device.Id; 
     this.DeviceName = device.Name; 

     this.InventoryValues = inventoryValues; 
    } 
} 

Создано Mapper:

Type genericClass = typeof(DefaultCsvClassMap<>); 
Type constructedClass = genericClass.MakeGenericType(typeof(EntryReportInventory)); 
       return (CsvClassMap)Activator.CreateInstance(constructedClass); 

А теперь волшебство. Я повторяю все свойства.

foreach (PropertyInfo property in mapping) 
      { 
... 
if (isInventoryReportBaseType && typeof(Dictionary<string, object>).IsAssignableFrom(property.PropertyType)) 
       { 
        var dataSource = (ReportInventoryBase)Activator.CreateInstance(entityType, dbContext); 

        foreach (var item in dataSource.ColumnNameAndText) 
        { 
         var columnName = item.Key; 

         var newMap = new CsvPropertyMap(property); 
         newMap.Name(columnName); 
         newMap.TypeConverter(new InventoryEntryListSpecifiedTypeConverter(item.Key)); 

         customMap.PropertyMaps.Add(newMap); 
        } 
... 
} 

И мой конвертер:

public class InventoryEntryListSpecifiedTypeConverter : CsvHelper.TypeConversion.ITypeConverter 
    { 
     private string indexKey; 
     public InventoryEntryListSpecifiedTypeConverter(string indexKey) 
     { 
      this.indexKey = indexKey; 
     } 

     public bool CanConvertFrom(Type type) 
     { 
      return true; 
     } 

     public bool CanConvertTo(Type type) 
     { 
      return true; 
     } 

     public object ConvertFromString(TypeConverterOptions options, string text) 
     { 
      throw new NotImplementedException(); 
     } 

     public string ConvertToString(TypeConverterOptions options, object value) 
     { 
      var myValue = value as Dictionary<string, object>; 
      if (value == null || myValue.Count == 0) return null; 

      return myValue[indexKey] + ""; 
     } 
    } 

Не знаю почему, но это работает, чтобы передать той же собственности в несколько раз. Вот и все :) Вам нужно иметь только список (здесь: dataSource.ColumnNameAndText, заполненный из внешнего источника), чтобы идентифицировать столбцы/значения.

 Смежные вопросы

  • Нет связанных вопросов^_^