1

所以我遇到了一些程序,这些程序用数据库中的数据构建特定的 XML。

现在我想做一个应用程序,我可以把它挂在带有值的结构化类上,它可以动态地读取它。

我对那个班级的想法是这样的

public class Order
{
    public string PO_NO { get; set; }
    ................
    public List<OrderDetails> OrderDetails = new List<OrderDetails>();
}

并且 XML 会如下所示

<ORDER>

<PO_NO>18060001</PO_NO>
....
   -<ORDER_DETAILS>

      -<ORDER_DETAIL>
      </ORDER_DETAIL>     
      -<ORDER_DETAIL>
      </ORDER_DETAIL>
    ...
   </ORDER_DETAILS>
-</ORDER>

我希望这涵盖了结构和想法。

到目前为止,我正在努力动态阅读课程。

最后一次也是我最接近的尝试是这样的:

foreach (var refer in DatabaseData.getRefs()) //just gets reference numbers for me, for further reading
            {
//THIS one returns the filled class. Eg. the Order class explained higher.
                var MyClass = DatabaseData.read(refer); 
                var fiel = DatabaseData.read(refer).GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
                foreach (var field in fiel)
                {
                    var fieldName = field.Name.Replace('<', ' ').Replace('>', ' ').Replace("__", null).Replace("kBackingField", null);

                    if (field.FieldType.ToString().Contains("List"))
                        Debug.WriteLine("its a list");
                    else
                        Debug.WriteLine((string)DatabaseData.read(refer).GetType().GetField(fieldName).GetValue(Activator.CreateInstance(DatabaseData.read(refer).GetType())));
                }
            }

这是困扰我的部分。我已经尝试了很多我在论坛上找到的变体,但我仍然得到了。对象引用未设置为对象的实例。

(string)DatabaseData.read(refer).GetType().GetField(fieldName).GetValue(Activator.CreateInstance(DatabaseData.read(refer).GetType()))

请问有什么想法吗?或者给我指出正确的方法。

提前致谢。

4

1 回答 1

2

在这里无需自己做任何事情;只需使用XmlSerializer.

您可能需要添加一些属性来获取所需的 XML:

[XmlRoot("ORDER")]
public class Order
{
    [XmlElement("PO_NO")] // note this one is implicit and not strictly needed
    public string PO_NO { get; set; }
    [XmlArray("ORDER_DETAILS")]
    [XmlArrayItem("ORDER_DETAIL")]
    public List<OrderDetails> OrderDetails {get;} = new List<OrderDetails>();
}

然后:

var serializer = new XmlSerializer(typeof(Order));

完成此操作后并不重要,但在这种情况下还需要使用 Roslyn 支持字段信息 - 只需查看GetProperties()and ,并在适当时GetFields()使用PropertyInfo.SetValue(...)而不是;FieldInfo.SetValue(...)含义:使用属性,而不是支持字段。

于 2018-10-15T13:11:21.240 回答