2016-11-08 14 views
0

Я использую пакет FileHelper nuget для разбора плоского файла в пользовательский класс списка DTO. В начале моего развития я жестко закодировал FixedFieldLength в файле класса, в котором был объявлен список участников, и я использовал этот класс для создания файлового сервера, но позже мы решили динамически создать длину поля и использовать ниже код для создания classBuilderFileHelperEngine возвращает список <object> вместо списка <T>

private FixedLengthClassBuilder BuildFixedLengthClass(string mplFileType) 
{ 
    var layoutDetails = GetLayoutDetailsFromDatabase(); 

    const string className = "My_Dynamic_Class"; 
    var fixedLengthClassBuilder = new FixedLengthClassBuilder(className); 

    foreach (var column in layoutDetails) 
    { 
     dynamic dynamicColumn = column; 

     fixedLengthClassBuilder.AddField(dynamicColumn.FieldName, 
      dynamicColumn.NumberOfCharacters, dynamicColumn.Data_Type); 

     if (dynamicColumn.Data_Type == "DateTime") 
     { 
      fixedLengthClassBuilder.LastField.Converter.Kind = 
       FileHelpers.ConverterKind.Date; 
      fixedLengthClassBuilder.LastField.Converter.Arg1 = "yyyyMMdd"; 
     } 
    } 
    return fixedLengthClassBuilder; 
} 

Теперь я использую объект, возвращаемый из выше методы для создания FileHelperEngine ниже

var fileHelperEngine = new FileHelperEngine(classBuilder.CreateRecordClass()) 
var parseResult = fileHelperEngine.ReadFileAsList(fileName); 

Теперь parseResult будет List<object>, где он должен быть List<T>

В fileHelperEngine возвращается List<T> когда мы не проходим в classBuilder.CreateRecordClass()

Из-за этого, я должен был каждую петлю записи и преобразовать в соответствующий вид. Я считаю, я не могу использовать Automapper даже для преобразования, поскольку свойства объекта не видны для преобразования.

Это что-то нужно добавить в эту библиотеку, или это то, что мне не хватает?

+0

'' Список является compiletime против 'Новый FixedLengthClassBuilder (имя класса)' является среда. Как он узнает, что '' он должен вернуться? Технически; «Список » может быть создан, но он будет возвращен как «IList» –

+0

Итак, когда я использовал в своем старом коде, я передаю '' в свой метод и создаю как этот var' fhEngine = new FileHelperEngine () ', поэтому он возвращает' List ', тогда как при передаче' classBuilder' он не принимает общий тип? – superachu

+0

Где вы передаете 'const string className =" My_Dynamic_Class ";' как '' параметр? вот почему ... В вашем примере 'fhEngine = new FileHelperEngine ()' вы делаете .. но не в приведенном выше примере. –

ответ

0

Попробуйте использовать Cast<T>() (с требуемым классом вставленной для T):

var parseResult = fileHelperEngine.ReadFileAsList(fileName).Cast<T>(); 
// if desired then add .ToList() or .ToArray() 
+0

Мое первое предположение было таким же, но '' неизвестно .... –

+0

T должен быть известен OP, я думаю. –

+0

'const string className =" My_Dynamic_Class ";' подразумевает, что это не так .. Он будет работать только в том случае, если известен некоторый базовый класс .. в этом случае 'Object' –