gpt4 book ai didi

c# 使用变量选择类属性?

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:29 24 4
gpt4 key购买 nike

我正在为我们现有的(但损坏的)系统之一添加功能。它从 Web 服务获取 XML 文件,对其进行解析,然后在将其打包回我们的数据库之前执行一些操作。

以前的开发者(现在已经离开)给我留下了这个小 gem :

http://dl.getdropbox.com/u/109069/wut.GIF

我想知道是否有办法解决这个问题?

我可以遍历每个节点并按名称分配给 wo 对象吗?

像这样(伪代码):

   foreach XmlNode xn in WorkorderNodeTree
{
//find out the property name of the current node
//match to the property in the workorder class
//set the value equal

wo.<xn.name> = xn.innertext

}

现在我发现的唯一接近的是这个(来自互联网):

 foreach (XmlNode xl in myXML)
{

object o = Assembly.GetExecutingAssembly().CreateInstance("Workorder", true);
Type t = xl.Name.GetType();
PropertyInfo pi = t.GetProperty(xl.Name);
pi.SetValue(o, xl.InnerText, null);


}

但它在 o 上返回空引用异常。我有点困惑,有什么建议吗?

我想这样做,我需要使用反射或泛型,但我以前从未想到过这些东西 - 任何人都可以提出任何可能指向正确方向或至少尝试解释反射的建议吗?

非常感谢大家,对于这篇冗长的帖子深表歉意!

编辑:

谢谢,非常真诚地感谢 Fredrik 和 Rytmis - 在我单调的办公环境中,你们都是白衣骑士。 Rytmis 的代码编辑解决了这个问题,但我在这个小时左右学到了很多东西 - 谢谢大家,真的很感激。

最佳答案

我认为您的代码可能需要一些调整。

foreach (XmlNode xl in myXML)
{
object o = Assembly.GetExecutingAssembly().CreateInstance("Workorder", true);
Type t = xl.Name.GetType();
PropertyInfo pi = t.GetProperty(xl.Name);
pi.SetValue(o, xl.InnerText, null);
}

这会为您设置的每个属性创建一个新的 WorkOrder 实例,并且还会尝试反射(reflect)来自 Name.GetType() 的 PropertyInfo,它实际上是 typeof(String),而不是您想要的 typeof(WorkOrder)它是。相反:

WorkOrder w = new WorkOrder();
Type t = typeof(WorkOrder);
foreach (XmlNode xl in myXML)
{
PropertyInfo pi = t.GetProperty(xl.Name);
pi.SetValue(w, xl.InnerText, null);
}

[编辑] 您可能还想指定一些绑定(bind)标志:

    PropertyInfo pi = t.GetProperty(xl.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);

这可能是必需的,也可能不是必需的。我永远不记得默认值是什么。 :)

关于c# 使用变量选择类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com