第一次海报,长时间读者。 我有一个XML导入要写(另一个是第一个),并且我迷失了可以采用的冲突方法和方法。
我尝试导入的XML看起来大致如下:
...
<TableRow>
<Field Name="DeliveryNote" Type="etc..">Text</Field>
<Field Name="OrderNumber" Type="etc..">Text</Field>
and so on...
</TableRow>
...
我有一个对象,其中包含大多数字段的属性(并非所有字段都是),而且我目前正在构造函数中填充属性,这些构造函数抛出相关的XElement来构建,如下所示:
public Order(XElement p_tableRow)
{
foreach (XElement field in p_TableRow.Elements("Field"))
{
switch (field.Attribute("Name").Value)
{
case "DeliveryNote":
ReasonCode = field.Value;
break;
case "OrderNumber":
OrderID = field.Value;
break;
case "ProductCode":
CustProductCode = field.Value;
break;
case "Quantity":
QuantityCharged = field.Value;
break;
...
我的问题是,虽然这可以完成工作,但它看起来非常笨重(而且很难看)。当然有更好的方法吗?
我已尝试通过投影了解如何执行此操作但未找到一个示例,您可以根据节点中的属性决定数据的目标。
我正在使用.NET 3.5
任何指针都会受到高度赞赏。
答案 0 :(得分:1)
你可以做一些映射并依赖反射:
private Dictionary<string, string> _mapping = new Dictionary<string, string>
{
{ "DeliveryNote", "ReasonCode" },
{ "OrderNumber", "OrderID" },
{ "ProductCode", "CustProductCode" },
{ "Quantity", "QuantityCharged" }
};
然后你的导入看起来像这样:
public Order(XElement p_tableRow)
{
foreach (XElement field in p_TableRow.Elements("Field"))
{
string propName = _mapping[field.Attribute("Name").Value];
PropertyInfo propInfo = GetType().GetProperty(propName);
propInfo.SetValue(this, field.Value);
}
}
然后您永远不必再次更新Order()
方法,只需添加新的属性/属性对即可。