public struct EconomicPara
    {
        public double CityBuildingTax;
        public double EducationTax;
        public double ElectionCost;
        public int MeasureUnUsefulDays;
        public int MeasureUsefulDays;
        public double MineCost;
        public double OilChangeCost;
        public double OilHandleCost;
        public double OilPrice;
        public int ProductionBaseLineDays;
        public double PutInError;
        public double ResoursesTax;
        public double StoreCost;
        public double ValueAddedTax;
        public double WaterCost;
        public double[] OilProductBaseLine;
        public double[] OilPerDay;
        public int OilPerDayCount;
        public int MeasureCount;
        public int[] MeasureSign;
        public double[] MeasureCost;
        public DateTime[] OilProductionDay;
        public int SpanYearsUseful;
        public bool[] MeasureUseful;
        public bool[] MeasureEconomicUseful;
        public double[] InOutRadio;
        public int[] MeasureDays;
        public DateTime[] MeasureStartDay;
    }要遍历这个结构体把里边的数据写到XML中,怎么遍历啊?
大侠们支支招

解决方案 »

  1.   

    反射...不过你这个就这么点儿字段,要是没有很多不同的struct,多写几句有什么问题?
      

  2.   

    private void button1_Click(object sender, EventArgs e)
            {
                Type type = typeof(TEmployee);
                foreach (FieldInfo mi in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                    richTextBox1.Text += "\r\n" + mi.Name;
            }
            struct TEmployee
            {
                string idno;
                string name;
                int age;
                string memo;
            }
    试试这个吧,刚找的
      

  3.   

    除了反射使用
    this.GetType().Members; 等
    以外 你还可以考虑使用自定义 迭代器比如public struct EconomicPara
        {
            public double CityBuildingTax;
            public double EducationTax;
            public double ElectionCost;
            public int MeasureUnUsefulDays;
            public int MeasureUsefulDays;
            public double MineCost;
            public double OilChangeCost;
            public double OilHandleCost;
            public double OilPrice;
            public int ProductionBaseLineDays;
            public double PutInError;
            public double ResoursesTax;
            public double StoreCost;
            public double ValueAddedTax;
            public double WaterCost;
            public double[] OilProductBaseLine;
            public double[] OilPerDay;
            public int OilPerDayCount;
            public int MeasureCount;
            public int[] MeasureSign;
            public double[] MeasureCost;
            public DateTime[] OilProductionDay;
            public int SpanYearsUseful;
            public bool[] MeasureUseful;
            public bool[] MeasureEconomicUseful;
            public double[] InOutRadio;
            public int[] MeasureDays;
            public DateTime[] MeasureStartDay;
        }
        public static class ex {
            public static IEnumerable<object> GetMember(this EconomicPara ep) {
                yield return ep.CityBuildingTax;
                yield return ep.EducationTax;
                yield return ep.ElectionCost;
                //yeild return ep.InOutRadio;
                yield return ep.MeasureCost;
                yield return ep.MeasureCount;
                //...挨到写完ep所有的成员当然你可以根据成员类型自己酌情搞一搞。
            }
        }
    使用扩展方法搞定,不用修改原来定义
      

  4.   


      //添加测试数据
            private void button1_Click(object sender, EventArgs e)
            {
                List<Test> li=new List<Test>();
                Test t = new Test();
                t.Name = "test";
                t.Pwd = "test";
                t.Age = 18;
                li.Add(t);
                this.getList(li);
                
            }
            //遍历
            private void getList(List<Test> li)
            {
                foreach (Test dinosaur in li)
                {
                    MessageBox.Show(dinosaur.Name + dinosaur.Pwd + dinosaur.Age.ToString());
                }
            }
        public struct Test
        {
            private string name;        public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private string pwd;        public string Pwd
            {
                get { return pwd; }
                set { pwd = value; }
            }
            private int age;        public int Age
            {
                get { return age; }
                set { age = value; }
            }
        }用泛型做的
      

  5.   

    JackLeiMM,不好意思,我没说明白需求,我有很多不同的structliherun
    (菜鸟路过)
    这位大侠,mi.GetValue(myobject)怎么接到数组的值?
      

  6.   

    struct TEmployee
            {
                string idno;
                string name;
                int age;
                string memo;
                string []myCount;
            }
    richTextBox1.Text += "\r\n" + mi.Name+mi.GetValue(myObject);
      

  7.   

    晕,还要想吗?既然是要写到xml里的,当然用XMLSerializer最方便了。
      

  8.   

    用其他方法虽然能解决问题,但是耦合度很高,如果你的struct的定义改变的话,其他类也要修改。
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;namespace WindowsApplication183
    {
        public partial class Form1 : Form
        {
            public struct EconomicPara
            {
                public double CityBuildingTax;
                public double EducationTax;
                public double ElectionCost;
                public int MeasureUnUsefulDays;
                public int MeasureUsefulDays;
                public double MineCost;
                public double OilChangeCost;
                public double OilHandleCost;
                public double OilPrice;
                public int ProductionBaseLineDays;
                public double PutInError;
                public double ResoursesTax;
                public double StoreCost;
                public double ValueAddedTax;
                public double WaterCost;
                public double[] OilProductBaseLine;
                public double[] OilPerDay;
                public int OilPerDayCount;
                public int MeasureCount;
                public int[] MeasureSign;
                public double[] MeasureCost;
                public DateTime[] OilProductionDay;
                public int SpanYearsUseful;
                public bool[] MeasureUseful;
                public bool[] MeasureEconomicUseful;
                public double[] InOutRadio;
                public int[] MeasureDays;
                public DateTime[] MeasureStartDay;
            }        public Form1()
            {
                InitializeComponent();            EconomicPara EP = new EconomicPara();
                EP.CityBuildingTax = 1;
                EP.EducationTax = 2;
                EP.ElectionCost = 3;
                EP.InOutRadio = new double[] { 4, 44 };
                EP.MeasureCost = new double[] { 5, 55 };
                EP.MeasureCount = 6;
                EP.MeasureDays = new int[] { 7, 77 };
                EP.MeasureEconomicUseful = new bool[] { true };
                EP.MeasureSign = new int[] { 9, 99 };
                EP.MeasureStartDay = new DateTime[] { DateTime.Now };
                EP.MeasureUnUsefulDays = 11;
                EP.MeasureUseful = new bool[] { false };
                EP.MeasureUsefulDays = 13;
                EP.MineCost = 14;
                EP.OilChangeCost = 15;
                EP.OilHandleCost = 16;
                EP.OilPerDay = new double[] { 17, 1717 };
                EP.OilPerDayCount = 18;
                EP.OilPrice = 19;
                EP.OilProductBaseLine = new double[] { 20, 2020 };
                EP.OilProductionDay = new DateTime[] { DateTime.Now };
                EP.ProductionBaseLineDays = 22;
                EP.PutInError = 23;
                EP.ResoursesTax = 24;
                EP.SpanYearsUseful = 25;
                EP.StoreCost = 26;
                EP.ValueAddedTax = 27;
                EP.WaterCost = 28;            foreach (FieldInfo FI in this.GetType().GetNestedType("EconomicPara").GetFields())
                {
                    Object Value = FI.GetValue(EP);                String S = "字段: " + FI.Name + Environment.NewLine
                        + "类型: " + FI.FieldType.Name + Environment.NewLine
                        + "值: " + Value.ToString() + Environment.NewLine;                if (Value.GetType().IsArray)
                    {
                        Array A = (Array)Value;
                        S += "子值: ";                    for (int i = 0; i < A.Length; i++)
                        {
                            S += A.GetValue(i).ToString();
                            if (i < A.Length - 1)
                                S += ",";
                        }
                    }                MessageBox.Show(S);
                }
            }
        }
    }
      

  10.   

    可以!
    你可以用序列化类,直接就可以写到XML文件里了,而且还可以直接从XML文件里,读出来,反序列化成类实例给你一段序列化的代码 public static string ObjectToXML( Object Instance )
    {
    MemoryStream stream = null;
    TextWriter writer = null;
    string ObjectXml = string.Empty;
    try
    {
    stream = new MemoryStream(); // read xml in memory
    writer = new StreamWriter( stream, Encoding.UTF8 ); // get serialise object
    Type t = Instance.GetType();
    XmlSerializer serializer = new XmlSerializer( t ); XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
    xsn.Add( string.Empty, string.Empty ); serializer.Serialize( writer, Instance, xsn ); // read object
    int count = ( int )stream.Length; // saves object in memory stream
    byte[] arr = new byte[count];
    stream.Seek( 0, SeekOrigin.Begin );
    // copy stream contents in byte array
    stream.Read( arr, 0, count );
    //UnicodeEncoding utf = new UnicodeEncoding(); // convert byte array to string
    UTF8Encoding utf = new UTF8Encoding();
    ObjectXml = utf.GetString( arr ).Trim();
    }
    catch ( Exception ex )
    {
    string ss = ex.Message;
    }
    finally
    {
    if ( stream != null && stream.Length > 0 )
    {
    stream.Close();
    }
    if ( writer != null )
    {
    writer.Close();
    }
    } return ObjectXml;
    }使用就是
    string xml = ObjectToXML(结构体变量);