I have testdata model, and I want to map the column values to existing class hierarchy property's and currently it is not mapping the values and shows NULL value
For instance in test data model i have field paymentOptions and in excel sheet the value is KlarnaOptions but after the map of datatable to list - the value of paymentOptions is showing NULL
Test Data Model
What I have tried:
<pre>namespace AutoFramework.Model.Excel
{
public partial class TestDataModel
{
public TestDataModel() {
}
[DataNames("TestName")]
public string TestName { get; set; }
[DataNames("productId")]
public int productId { get; set; }
[DataNames("orderId")]
public int orderId { get; set; }
[DataNames("designMethod")]
public DesignMethod designMethod { get; set; }
[DataNames("signedIn")]
public bool signedIn { get; set; }
[DataNames("increaseBasketQty")]
public bool increaseBasketQty { get; set; }
[DataNames("signedInCMS")]
public bool signedInCMS { get; set; }
[DataNames("editable")]
public bool editable { get; set; }
[DataNames("paymentOptions")]
public PaymentOptions paymentOptions { get; set; }
[DataNames("checkInVoice")]
public bool checkInVoice { get; set; }
[DataNames("navigateToDesign")]
public bool navigateToDesign { get; set; }
[DataNames("checkOrderAuthorsie")]
public bool checkOrderAuthorsie { get; set; }
[DataNames("checkSplitOrder")]
public bool checkSplitOrder { get; set; }
[DataNames("SiteId")]
public string SiteId { get; set; }
[DataNames("SiteUrl")]
public string SiteUrl { get; set; }
[DataNames("CultureCode")]
public string CultureCode { get; set; }
[DataNames("SiteGroupId")]
public string SiteGroupId { get; set; }
[DataNames("NickName")]
public string NickName { get; set; }
[DataNames("byCard")]
public KlarnaOptions byCard { get; set; }
[DataNames("payLater")]
public bool payLater { get; set; }
[DataNames("sliceIt")]
public bool sliceIt { get; set; }
[DataNames("portal")]
public PaymentPortal portal { get; set; }
[DataNames("delivery")]
public DeliveryMethod delivery{get;set;}
}
}
Mapper for converting Datatable to list
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Framework.Model.Excel
{
public class DataNamesMapper<TEntity> where TEntity : class, new()
{
public TEntity Map(DataRow row)
{
TEntity entity = new TEntity();
return Map(row, entity);
}
public TEntity Map(DataRow row, TEntity entity)
{
var columnNames = row.Table.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToList();
var properties = (typeof(TEntity)).GetProperties()
.Where(x => x.GetCustomAttributes(typeof(DataNamesAttribute), true).Any())
.ToList();
foreach (var prop in properties)
{
PropertyMapHelper.Map(typeof(TEntity), row, prop, entity);
}
return entity;
}
public IEnumerable<TEntity> Map(DataTable table)
{
List<TEntity> entities = new List<TEntity>();
var columnNames = table.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToList();
var properties = (typeof(TEntity)).GetProperties()
.Where(x => x.GetCustomAttributes(typeof(DataNamesAttribute), true).Any())
.ToList();
foreach (DataRow row in table.Rows)
{
TEntity entity = new TEntity();
foreach (var prop in properties)
{
PropertyMapHelper.Map(typeof(TEntity), row, prop, entity);
}
entities.Add(entity);
}
return entities;
}
}
}
Existing Property Type:
public class PaymentOptions
{
public PaymentPortal portal;
public DeliveryMethod delivery = DeliveryMethod.Billing;
public PaymentOptions()
{
}
public PaymentOptions(Site site)
{
}
}
public class KlarnaOptions : PaymentOptions
{
public bool byCard = false;
public bool payLater = false;
public bool sliceIt = false;
public KlarnaOptions()
{
portal = PaymentPortal.Klarna;
}
}