如何通过名称动态访问类字段

时间:2019-04-02 09:53:12

标签: c#

我上了这个课:

public class City
{
    public string city;
    public float residence;
    public float industry;
    public float trade;
    public float total;
}

我想使用foreach循环访问行:

List<City> cities = new List<City>();
string[] rows = {"city", "residence", "industry", "trade", "total"};

foreach(string x in rows)
{
    Debug.Log(cities[5].x); // this doesn't work
}

cities[5].residencecities[5].total可以工作,但我不想直接写。

我想引用residence之类的industrycities[3].x,如何使它以这种方式工作?

1 个答案:

答案 0 :(得分:1)

由于您使用的是面向对象的程序C#,因此我鼓励您改善代码的封装:思考行为而不是数据。

这意味着可以通过以下方式将City改进为实现该目标:

public sealed class City
{
    private readonly string city;
    private readonly float residence;
    private readonly float industry;
    private readonly float trade;
    private readonly float total;

    public City(string city, float residence, float industry, float trade, float total)
    {
        this.city = city;
        this.residence = residence;
        this.industry = industry;
        this.trade = trade;
        this.total = total;
    }

    public IEnumerable<string> YieldProperties()
    {
        yield return city;
        yield return residence.ToString("R");
        yield return industry.ToString("R");
        yield return trade.ToString("R");
        yield return total.ToString("R");
    }
}

使用情况变为

List<City> cities = new List<City>();
foreach(string p in cities[5].YieldProperties())
{
    Debug.Log(p);
}

那我做了什么改变?

  • 我正确封装了类字段,以避免它们泄漏到外部(这会降低代码的可维护性)
  • 我提供了一种行为:能够以字符串的形式逐个产生每个元素
  • 我使用sealedreadonly使该类不可变(这是可维护性的一种好习惯)
  • 我删除了过时的变量rows,这非常危险:如果忘记更新City的内容,则在rows中重命名字段将破坏代码
  • 没有使用任何反射,我认为应该尽可能避免