【问题标题】:Getting empty List by converting properties into List通过将属性转换为列表来获取空列表
【发布时间】:2014-11-03 14:57:29
【问题描述】:

我有以下属性类:

 public class Ctas
    {
        private string _CodAgrup;
        public string CodAgrup
        {
            get { return _CodAgrup; }
            set { _CodAgrup = value; }
        }
        private string _NumCta;

        public string NumCta
        {
            get { return _NumCta; }
            set { _NumCta = value; }
        }

        private string _Desc;
        public string Desc
        {
            get { return _Desc; }
            set { _Desc = value; }
        }

        private string _subctade;
        public string SubCtaDe
        {
            get { return _subctade; }
            set { _subctade = value; }
        }

        private string _Nivel;
        public string Nivel
        {
            get { return _Nivel; }
            set { _Nivel = value; }
        }
        private string _Natur;
        public string Natur
        {
            get { return _Natur; }
            set { _Natur = value; }
        }

        public override string ToString()
        {
            return "CodAgrup = " + CodAgrup + ", NumCta = " + NumCta + ", Desc = " + Desc + ", SubCtaDe = " + SubCtaDe + ", Nivel = " + Nivel + ", Natur = " + Natur;
        }
  #endregion
    }

我已经从这些属性创建了一个 XML,所以首先我必须填充属性,然后我得到了我想用来填充属性的下一个方法,第一个问题是,我的方式是否正确用于填充属性?

然后我应该检索数据并将其写入 XML 文件,因此我将属性数据转换为列表,然后将它们写为属性但是当我调试时,我得到列表是空的,为什么会这样? 最好的方法是什么?

//Insert n data on properties
static void cuenta(string codagroup, string numcta, string desc, string subctade, string nivel, string natur)
        {
            Ctas cuentas = new Ctas();
            int x = 0;
          while (cuentas.CodAgrup != null)
          { 
                cuentas.CodAgrup.Insert(x, "codagroup");
                cuentas.NumCta.Insert(x, "numcta");
                cuentas.Desc.Insert(x, "desc");
                cuentas.SubCtaDe.Insert(x,"subctade");
                cuentas.Nivel.Insert(x, "nivel");
                cuentas.Natur.Insert(x, "natur");
                x = x + 1;
            }
        }

//Converting propierties data into list
 List<string> coda = cuentas.CodAgrup.GetType().GetProperties().Select(p => p.Name).ToList();
                List<string> ncta = cuentas.NumCta.GetType().GetProperties().Select(p => p.Name).ToList();
                List<string> desc = cuentas.Desc.GetType().GetProperties().Select(p => p.Name).ToList();
                List<string> subdes = cuentas.SubCtaDe.GetType().GetProperties().Select(p => p.Name).ToList();
                List<string> nivel = cuentas.Nivel.GetType().GetProperties().Select(p => p.Name).ToList();
                List<string> natur = cuentas.Natur.GetType().GetProperties().Select(p => p.Name).ToList();
//Create XML from data in list´s
 for (int i = 0; i < coda.Count; i++)
                {
                    xmlWriter.WriteAttributeString("CodAgrup", coda[i]);
                    xmlWriter.WriteAttributeString("NumCta", ncta[i]);
                    xmlWriter.WriteAttributeString("Desc", desc[i]);
//write the atribute when property data exists.
                    if (cuentas.SubCtaDe != null)
                    {
                        xmlWriter.WriteAttributeString("SubCtaDe", subdes[i]);
                    }
                    xmlWriter.WriteAttributeString("Nivel", nivel[i]);
                    xmlWriter.WriteAttributeString("Natur", natur[i]);
                    xmlWriter.WriteEndElement();

                }

【问题讨论】:

  • while 循环中的代码将永远不会执行,因为如果您在实例化 cuentas 后不对其进行初始化,cuentas.CodAgrup 将为空。

标签: c# xml properties


【解决方案1】:

您的代码令人困惑,但如果我理解正确,这是我看到的第一个错误:

  Ctas cuentas = new Ctas();
  int x = 0;
  while (cuentas.CodAgrup != null)   // cuentas.CodAgrup is null from the beginning!
  { 
        cuentas.CodAgrup.Insert(x, "codagroup");
        cuentas.NumCta.Insert(x, "numcta");
        cuentas.Desc.Insert(x, "desc");
        cuentas.SubCtaDe.Insert(x,"subctade");
        cuentas.Nivel.Insert(x, "nivel");
        cuentas.Natur.Insert(x, "natur");
        x = x + 1;
  }

由于您正在查看一个全新的Ctas 对象,并且没有初始化CodAgrup 属性的代码,它将具有null 的默认值,因此代码永远不会进入while循环。

即使它确实如此,我怀疑这将是一个无限循环,因为您将 Insert 将文字值输入到字符串属性中,并且没有条件我看到 cuentas.CodAgrup 将永远为空。

至于您的 XML 生成,为什么不直接使用内置的 XmlSerializer 类呢?即使您需要特定格式,也有一些属性可以让您自定义生成的 XML。

【讨论】:

  • 你说得对,应该没有引号,我知道该怎么做,顺便问一下,如果要输入的数据数量未知,如何填充属性?。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2022-10-13
  • 2020-07-20
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多