访问班级列表的最简单方法

时间:2013-06-19 10:44:57

标签: c# .net

首先,这是我在这里发表的第一篇文章,如果这是错的,或者只是警告我下次会更好。

其次我说法语x)。

好吧这不是问题,但我希望有更好的方法来访问存储在母班中的数据。我知道我不清楚让我告诉你也许你会理解。

Main.cs:

namespace Xahor
{
    class Program
    {

        static void Main(string[] args)
        {
            TProduct test = new TProduct();

            test.FillData(1, "Apple", "4857", "A tasty apple.", "Green", false, true);

            test.PrintData();
        }
    }
}

TListNF.cs:

namespace Xahor
{
    public class TListNF
    {
        public TListNF(int iProductID = 0, string sProductName = "", string sProductIDNum = "", string sProductDesc = "", string sColor = "", bool bMake = false, bool bCustom = false)
        {
            this.iProductID = iProductID;
            this.sProductName = sProductName;
            this.sProductIDNum = sProductIDNum;
            this.sProductDesc = sProductDesc;
            this.sColor = sColor;
            this.bMake = bMake;
            this.bCustom = bCustom;
        }

        public int iProductID { get; set; }
        public string sProductName { get; set; }
        public string sProductIDNum { get; set; }
        public string sProductDesc { get; set; }
        public string sColor { get; set; }
        public bool bMake { get; set; }
        public bool bCustom { get; set; }

        protected List<TListNF> ItemList = new List<TListNF>();
    }
}

TProduct.cs:

namespace Xahor
{
    class TProduct : TListNF
    {
        public void FillData(int iProductID, string sProductName, string sProductIDNum, string sProductDesc, string sColor, bool bMake, bool bCustom)
        {
            ItemList.Add(new TListNF(iProductID, sProductName, sProductIDNum, sProductDesc, sColor, bMake, bCustom));
        }

        public void PrintData()
        {
            foreach (TListNF t in ItemList)
            {
                //Here where * is each of the accessor
                Console.WriteLine(t.*.ToString()); 
                Console.WriteLine(t.*.ToString()); 
                ...
            }
        }
    }
}

所以,基本上我不知道怎么做是为了更方便地访问getter,它通常是foreach,所以每次进入循环时var t得到值

解决

@Nair

谢谢你我已经找到了帖子

How to loop through all the properties of a class?

但是,如果其他人需要像我这样的事情,那么你的回答会有所帮助

foreach (PropertyInfo p in list.GetType().GetProperties())
                {
                    Console.WriteLine(p.Name + " : " + p.GetValue(list));
                }
//Where list is the List<ClassName_With_Accesor> list;

2 个答案:

答案 0 :(得分:0)

您可以通过反映类型中的各个属性来实现它。您可能需要添加更具建设性的逻辑,因为目的是展示这个想法。

   foreach (TListNF t in ItemList)
  {
   foreach (PropertyInfo proInfo in t.GetType().GetProperties())
      {
       Console.WriteLine(proInfo.GetGetMethod().Invoke(t,null).ToString());
      }
  }

答案 1 :(得分:0)

当然答案@Nair是正确的。但通常使用反射来实现简单的目的是不好的做法。这是因为您的应用程序的访问权限等。您可以尝试另外两种选择。

选项1:以自己的方法生成属性(请参阅TListNF.GetItemInfo)。缺点:每次向TListNF类添加另一个属性时,必须在GetItemInfo的实现中添加另一个yield。优点:根本不使用反射。

选项2:使用自己的属性(请参阅MyInfoAttribute)来标记您感兴趣的属性。通常,类有多个您不想打印的属性。优点:仅打印标记的属性:缺点:使用反射。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        [AttributeUsage(AttributeTargets.Property)]
        public class MyInfoAttribute : Attribute
        {
        }

        public class TListNF
        {
            public TListNF(int iProductID = 0, string sProductName = "", string sProductIDNum = "", string sProductDesc = "", string sColor = "", bool bMake = false, bool bCustom = false)
            {
                this.iProductID = iProductID;
                this.sProductName = sProductName;
                this.sProductIDNum = sProductIDNum;
                this.sProductDesc = sProductDesc;
                this.sColor = sColor;
                this.bMake = bMake;
                this.bCustom = bCustom;
            }

            [MyInfo]
            public int iProductID { get; set; }
            [MyInfo]
            public string sProductName { get; set; }
            [MyInfo]
            public string sProductIDNum { get; set; }
            [MyInfo]
            public string sProductDesc { get; set; }
            [MyInfo]
            public string sColor { get; set; }
            [MyInfo]
            public bool bMake { get; set; }
            [MyInfo]
            public bool bCustom { get; set; }

            protected List<TListNF> ItemList = new List<TListNF>();

            public IEnumerable<string> GetItemInfo()
            {
                yield return iProductID.ToString();
                yield return sProductName;
                yield return sProductIDNum;
                yield return sProductDesc;
                yield return sColor;
                yield return bMake.ToString();
                yield return bCustom.ToString();
            }
        }

        class TProduct : TListNF
        {
            public void FillData(int iProductID, string sProductName, string sProductIDNum, string sProductDesc, string sColor, bool bMake, bool bCustom)
            {
                ItemList.Add(new TListNF(iProductID, sProductName, sProductIDNum, sProductDesc, sColor, bMake, bCustom));
            }

            public void PrintData()
            {
                foreach (TListNF item in ItemList)
                {
                    foreach (string info in item.GetItemInfo())
                        Console.WriteLine(info);
                }
            }

            public void PrintDataReflection()
            {
                Type type = typeof(MyInfoAttribute);

                foreach (TListNF item in ItemList)
                {
                    foreach (PropertyInfo proInfo in item.GetType().GetProperties().Where(p => p.GetCustomAttributes(type, true).Length > 0))
                    {
                        Console.WriteLine(proInfo.GetGetMethod().Invoke(item, null).ToString());
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            var test = new TProduct();

            test.FillData(1, "Apple", "4857", "A tasty apple.", "Green", false, true);

            test.PrintData();
            test.PrintDataReflection();

            Console.ReadKey();
        }
    }
}