现在,我已经为这个问题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的名称在任何方面都没有好处...
我很高兴看到我的整个方法可能不在这里,而且我不是在寻找任何人为我解决问题,只是指出我正确的方向,因为我目前正在圈子里... >