正在根据属性值加载 XML

Loading XML based on attribute value

第一次发帖,很久了reader。 我有一个 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

任何指点将不胜感激。

您可以做一些映射并依靠反射:

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() 方法,只需将新的 attribute/property 对添加到映射中即可。