FileHelpers.Dynamic.ClassBuilder.CreateRecordClass Error
本文关键字:Error CreateRecordClass ClassBuilder Dynamic FileHelpers | 更新日期: 2023-09-27 18:34:17
我正在尝试读取一个在运行时创建的布局的文件。但是当运行 FixedLengthClassBuilder.CreateRecordClass () 时,会发生异常:
Error Compiling Expression:
Line 31: The type or namespace name 'SGCompras' could not be found (are you missing a using directive or an assembly reference?).
我的代码:
public void ReadFile(string filePath){
...
var itemsLayout = Context.FixedLayouts.Where(p => p.LayoutName == "Margem").ToList();
var builder = GetFixedClass(itemsLayout, "Margem");
var layout = builder.CreateRecordClass();
var engine = new FileHelperEngine(layout);
var linhasArquivo = engine.ReadFile(filePath);
...
}
public FixedLengthClassBuilder GetFixedClass(List<FixedLengthLayout> items, string className){
var cb = new FixedLengthClassBuilder(className);
foreach (var item in items)
{
switch (item.FieldDataType)
{
case "String":
cb.AddField(item.FieldName, item.FieldLength, typeof(string));
cb.LastField.FieldNullValue = string.Empty;
cb.LastField.AlignMode = AlignMode.Left;
cb.LastField.AlignChar = ' ';
cb.LastField.TrimMode = TrimMode.Both;
break;
case "Date":
cb.AddField(item.FieldName, item.FieldLength, typeof(DateTime));
cb.LastField.FieldNullValue = string.Empty;
break;
case "Custom Date":
cb.AddField(item.FieldName, item.FieldLength, typeof(DateTime));
cb.LastField.FieldNullValue = string.Empty;
cb.LastField.Converter.TypeName = typeof(CustomDateConverter).FullName;
cb.LastField.AlignMode = AlignMode.Right;
cb.LastField.AlignChar = '0';
break;
case "Integer":
cb.AddField(item.FieldName, item.FieldLength, typeof(int?));
cb.LastField.FieldNullValue = 0;
cb.LastField.AlignMode = AlignMode.Right;
cb.LastField.AlignChar = '0';
break;
case "Long Integer":
cb.AddField(item.FieldName, item.FieldLength, typeof(long?));
cb.LastField.FieldNullValue = 0;
cb.LastField.AlignMode = AlignMode.Right;
cb.LastField.AlignChar = '0';
break;
case "Decimal":
cb.AddField(item.FieldName, item.FieldLength, typeof(decimal?));
cb.LastField.FieldNullValue = 0;
cb.LastField.AlignMode = AlignMode.Right;
cb.LastField.AlignChar = '0';
break;
case "Custom Decimal":
cb.AddField(item.FieldName, item.FieldLength, typeof(decimal?));
cb.LastField.FieldNullValue = 0;
cb.LastField.Converter.TypeName = typeof(CustomDecimalConverter).FullName;
cb.LastField.AlignMode = AlignMode.Right;
cb.LastField.AlignChar = '0';
break;
}
}
return cb;
}
public class CustomDateConverter : ConverterBase
{
public override object StringToField(string stringValue)
{
if (string.IsNullOrEmpty(stringValue) || stringValue == "00000000")
{
return null;
}
return DateTime.ParseExact(stringValue, "ddMMyyyy", CultureInfo.InvariantCulture);
}
public override string FieldToString(object fieldValue)
{
return fieldValue == null ? "00000000" : ((DateTime)fieldValue).ToString("ddMMyyyy");
}
}
public class CustomDecimalConverter : ConverterBase
{
public override object StringToField(string from)
{
return Convert.ToDecimal(decimal.Parse(from) / 100);
}
public override string FieldToString(object fieldValue)
{
return ((decimal)fieldValue).ToString("0.00").Replace(".", "").Replace(",", "");
}
}
该错误与我的自定义转换器有关。
异常源代码
[FixedLengthRecord(FixedMode.ExactLength)]
public sealed class Margem
{
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(12)]
public System.String MatriculaCliente;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(11)]
public System.String CPFCliente;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(50)]
public System.String NomeCliente;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(2)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> MesReferencia;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(4)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> AnoReferencia;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDecimalConverter))]
[FieldFixedLength(9)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Decimal> ValorMargemFolha;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDecimalConverter))]
[FieldFixedLength(9)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Decimal> ValorMargemCartao;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDecimalConverter))]
[FieldFixedLength(9)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Decimal> ValorDescontoObrigatorio;
[FieldNullValue("")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDateConverter))]
[FieldFixedLength(8)]
[FieldAlign(AlignMode.Right, '0')]
public System.DateTime DataNascimento;
[FieldNullValue("")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDateConverter))]
[FieldFixedLength(8)]
[FieldAlign(AlignMode.Right, '0')]
public System.DateTime DataAdmissao;
[FieldNullValue("")]
[FieldConverter(typeof(SGCompras.Nucleo.FileHelper.FileConverters.CustomDateConverter))]
[FieldFixedLength(8)]
[FieldAlign(AlignMode.Right, '0')]
public System.DateTime DataDemissao;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(4)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> RegimeTrabalho;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(3)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> CodigoBanco;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(10)]
public System.String NumeAgenciaBanco;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(1)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> NumeroDigitoAgencia;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(12)]
public System.String NumeroContaBanco;
[FieldNullValue(typeof(System.Int32), "0")]
[FieldFixedLength(1)]
[FieldAlign(AlignMode.Right, '0')]
public System.Nullable<System.Int32> NumeroDigitoConta;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(65)]
public System.String ReservadoEmpresa;
[FieldNullValue("")]
[FieldTrim(TrimMode.Both)]
[FieldFixedLength(10)]
public System.String Critica;
}
异常堆栈跟踪
at FileHelpers.Dynamic.ClassBuilder.ClassFromString(String classStr, String className, NetLanguage lang, List`1 additionalReferences)
at FileHelpers.Dynamic.ClassBuilder.CreateRecordClass()
at SGCompras.Servicos.ServicoArquivo.ReadFile(String filePath) in D:'Projetos'SGCompras'SGCompras.Servicos'ServicoArquivo.cs:line 356
您可以查看字段转换器正确构建的异常的源代码,如下所示:
[FieldConverter (typeof (SGCompras.Nucleo.FileHelper.FileConverters.CustomDateConverter))]
有人会知道会发生什么?
编辑
将文件帮助程序从 2.0 更新到 3.1.5 并添加以下内容:
classBuilder.AdditionalReferences.Add(typeof(MyCustomConverter.DecimalConverter).Assembly);