1

首先,这是我在这里的第一篇文章,如果有错误或任何警告我,下次会更好。

其次,我说法语 x)。

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

主要.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 获取值

解决

@奈尔

谢谢你,我已经弄清楚了这个帖子

如何遍历一个类的所有属性?

但是顺便说一句,如果其他人需要我用过的类似的东西,你的回答会有所帮助

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

2 回答 2

0

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

   foreach (TListNF t in ItemList)
  {
   foreach (PropertyInfo proInfo in t.GetType().GetProperties())
      {
       Console.WriteLine(proInfo.GetGetMethod().Invoke(t,null).ToString());
      }
  }
于 2013-06-19T11:16:07.293 回答
0

当然@Nair 的答案是正确的。但通常为了简单的目的使用反射是不好的做法。这是因为您的应用程序的访问权限等等。您可以在这里尝试其他两个选项。

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

选项 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();
        }
    }
}
于 2013-06-19T11:50:45.920 回答