将数据映射到模型

时间:2020-09-28 13:02:09

标签: c# asp.net

现在,我已经为这个问题scratch了一段时间-我使用的是POS产品,该产品以较早的INI格式输出数据,例如:

[TRX]
TOT1=TotalSale
NAM1,1=NameOfFirstItem
PRI1,1=PriceOfFirstItem
NAM1,2=NameOfSecondItem
PRI1,2=PriceOfSecondItem
TOT2=TotalSale
PRI2,1=PriceofFirstItem

依此类推-每个部分包含多个事务,每个事务可以包含多行。所以我正在尝试用C#对此建模,看起来像

public class TransactionModel 
{
     public double Total { get; set; }
     public List<ItemModel> { get; set; }
} 

最初,我有一个巨大的switch语句,但是其中一些文件可能具有100种可能性,但是我拥有使用手册并知道每种可能性,但这显然变得难以维护。我一直在玩自定义属性,但是我已经达到了功能极限,无法解决。

按现状,我遍历文件中的每一行,将键传递给switch语句,并逐一分配属性。我发现如果可以为每个属性分配一个FieldName属性:

[FieldName("PRI")]
public double Price { get; set; }

必须有某种通用的方式映射它,但我无法使其正常工作。刚才我有:

public static void MapFile<T>(T item, string propName, string value, object obj) where T : new()
        {
            var type = item.GetType();
            var properties = type.GetProperties();

            foreach (var property in properties)
            {
                var attributes = property.GetCustomAttributes(false);
                var mapping = attributes.FirstOrDefault(a => a.GetType() == typeof(FieldNameAttribute));

                if (mapping != null)
                {
                    var mapsTo = mapping as FieldNameAttribute;

                    if (propName == mapsTo.Name)
                    {
                        switch (property.PropertyType.Name)
                        {
                            case nameof(DateTime):
                                property.SetValue(obj, value.ParseFuelPOSDate());
                                break;
                            case nameof(Boolean):
                                property.SetValue(obj, value.Equals("YES"));
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }

但是当涉及到对象内部的项目列表时,这种情况就落空了,我不认为打开PropertyType的名称在任何方面都没有好处...

我很高兴看到我的整个方法可能不在这里,而且我不是在寻找任何人为我解决问题,只是指出我正确的方向,因为我目前正在圈子里...

0 个答案:

没有答案