动态阅读 class
Dynamically reading class
所以我遇到过制作一些程序,这些程序使用数据库中的数据构建特定的 XMLs。
现在我想制作一个应用程序,我可以将其挂在带有值的结构化 class 上,它可以动态读取它。
我的想法class是这样的
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>
我希望这涵盖了结构和想法。
到目前为止,我正在努力动态阅读 class。
最后也是我想最接近的尝试是这样的:
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()))
有什么想法吗?或者给我指出正确的方法。
提前致谢。
这里不需要自己做任何事情;只需使用 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()
和 GetFields()
,并使用 PropertyInfo.SetValue(...)
而不是 FieldInfo.SetValue(...)
在适当的时候;含义:使用 属性,而不是支持字段。
所以我遇到过制作一些程序,这些程序使用数据库中的数据构建特定的 XMLs。
现在我想制作一个应用程序,我可以将其挂在带有值的结构化 class 上,它可以动态读取它。
我的想法class是这样的
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>
我希望这涵盖了结构和想法。
到目前为止,我正在努力动态阅读 class。
最后也是我想最接近的尝试是这样的:
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()))
有什么想法吗?或者给我指出正确的方法。
提前致谢。
这里不需要自己做任何事情;只需使用 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()
和 GetFields()
,并使用 PropertyInfo.SetValue(...)
而不是 FieldInfo.SetValue(...)
在适当的时候;含义:使用 属性,而不是支持字段。