Это то, что я сделал. Надеюсь, это может вам помочь.
- Создан таблицы БД и хранятся различные форматы файла макета Фиксированный (например, размер Имя поля, тип данных и длину поля и т.д. ...)
- В UI первый пользователь выбирает Фиксированный компоновки файла, а затем выбирает Фиксированный файл для импорта.
- Основываясь на выбранном макете, я создаю фиксированную длину. Тип класса во время выполнения с использованием приведенного ниже кода.
private void ImportFiles()
{
DataTable dt = GetFixedFileSpecsFromDB(layoutName); //Get the specs
//Create Dynamic class based on Specs above
FixedLengthClassBuilder cb = GetSpecClass(dt);
//Create FileHelpers engine instance
FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass());
//Read file data into Data table
DataTable dtImportData = engine.ReadFileAsDT(ImportFilePath);
}
//Method to create the Fixed lentgh dynamic class
public static FixedLengthClassBuilder GetSpecClass(DataTable dt)
{
string className = "ImportSpecifications";
FixedLengthClassBuilder cb = new FixedLengthClassBuilder(className);
//Loop thru each field and prepare the class
foreach (DataRow dr in dt.Rows)
{
int fieldLength = Convert.ToInt32(dr.Field<decimal>("FieldLength"));
switch (dr["FieldDataType"].ToString())
{
case "String":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(string));
cb.LastField.FieldNullValue = string.Empty;
cb.LastField.TrimMode = FileHelpers.TrimMode.Both;
break;
case "Date":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(DateTime));
cb.LastField.FieldNullValue = string.Empty;
break;
case "Integer":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(int?));
//cb.LastField.FieldNullValue = 0;
break;
case "Long Integer":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(long));
cb.LastField.FieldNullValue = 0;
break;
case "Decimal":
cb.AddField(dr.Field<string>("FieldName"), fieldLength, typeof(decimal?));
//cb.LastField.FieldNullValue = 0;
break;
default:
break;
}
}
return cb;
}
копать немного глубже, как это Im думать теперь, что это может быть возможно с помощью отражения, чтобы установить свойство атрибута, я просто хотел бы знать, если есть чистое решение ... спасибо HTTP: // stackoverflow.com/questions/18201971/how-do-i-get-the-custom-attribute-value-of-a-field – user3086298
Могу ли я уточнить, что вы намереваетесь сделать здесь. Вы намерены иметь такую же ширину символов, то есть ширину 80 символов, но внутренний размер каждого столбца и количество столбцов могут измениться? Однако, как только данные загружаются в Class1, вы хотите перенести данные в Class2? где макет, возможно, сократил колонку или добавил новую? Можете ли вы предоставить быстрый пример проекта того, что вы хотите (хотя без магии RuntimeHelpers) – netniV
разные файлы могут иметь разные позиции для поля, так что скажем, имя CustomerName может начинаться с 10 конца 20 в одном файле, но в другом файле может начаться 50 end 90 – user3086298