首先,这是我在这里发表的第一篇文章,如果这是错的,或者只是警告我下次会更好。
其次我说法语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;
答案 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();
}
}
}