Невозможно привести объект типа ошибки в лямбда-выражении (CsvHelper) - PullRequest
1 голос
/ 22 февраля 2020

Использование CsvHelper и ClassMap для сопоставления объектной модели с выводом. Попытка динамически генерировать отображение с помощью лямбда-выражений. До сих пор:

public class BaseClassMap<TClass> : ClassMap<TClass> where TClass : class
{
    public BaseClassMap(List<string> columns)
    {
        var index = 0;
        PropertyInfo[] props = typeof(TClass).GetProperties();
        foreach (PropertyInfo prop in props)
        {
            index = columns.IndexOf(prop.Name);
            if (index != -1)
            {
                var columnAttribute = prop.GetCustomAttributes(false).FirstOrDefault(a => a.GetType() == typeof(ColumnAttribute)) as ColumnAttribute;

                var parameterExpression = Expression.Parameter(typeof(TClass), "x");
                var memberExpression = Expression.PropertyOrField(parameterExpression, prop.Name);
                var memberExpressionConversion = Expression.Convert(memberExpression, typeof(object));
                var lambda = Expression.Lambda<Func<TClass, object>>(memberExpressionConversion, parameterExpression);
                Map<object>(lambda).Index(index).Name(columnAttribute != null ? columnAttribute.Name : prop.Name);
            }
        }
    }
}

Получение:

Невозможно привести объект типа CsvHelper.Configuration.MemberMap 2[KXL_CDMS_svc.Data.Entities.ExpTempApplication.TempEnvPermitTrackingCdms,System.String] к типу CsvHelper.Configuration.MemberMap 2[KXL_CDMS_svc.Data.Entities.ExpTempApplication.TempEnvPermitTrackingCdms,System.Object].

в

Map<object>(lambda).Index(index).Name(GetTitle(columnAttribute != null ? columnAttribute.Name : prop.Name));

Новое в лямбда-выражениях. Есть предложения?

1 Ответ

0 голосов
/ 24 февраля 2020

Вам просто нужно использовать другую перегрузку метода Map.

public class BaseClassMap<TClass> : ClassMap<TClass> where TClass : class
{
    public BaseClassMap(List<string> columns)
    {
        var index = 0;
        PropertyInfo[] props = typeof(TClass).GetProperties();
        foreach (PropertyInfo prop in props)
        {
            index = columns.IndexOf(prop.Name);
            if (index != -1)
            {
                var columnAttribute = prop.GetCustomAttributes(false).FirstOrDefault(a => a.GetType() == typeof(ColumnAttribute)) as ColumnAttribute;

                Map(typeof(TClass), prop).Name(columnAttribute != null ? columnAttribute.Name : prop.Name);
            }
        }
    }
}
...