C#如何以编程方式构建属性名称

时间:2015-07-28 14:25:47

标签: c#

我有一个名为“Agent”的对象。代理商拥有10个名为lab1至lab10的物业。我需要将这些属性分配给表单txtFieldLabel1到txtFieldLabel10上的文本框。在下面的例子中,循环中操作符的左侧很好。我无法弄清楚右侧。我需要根据循环的索引动态构建属性名称。这似乎应该相当简单,类似于运算符的左侧。

       for (int i = 1; i <= 10; i++)
        {
            tlp.Controls["txtFieldLabel" + i.ToString()].Text = Agent.lab + i.ToString();
        }

4 个答案:

答案 0 :(得分:1)

Agent.GetType().GetProperty("lab" + i).GetValue(Agent, null);

这将获得使用反射定义为labX的属性的值,其中Xi的值。

编辑:更改为GetValue(Agent, null)而不是GetValue(Agent),因为在.NET 4.5中引入了单个对象参数的重载。

答案 1 :(得分:1)

您可以像其他人提到的那样使用反射,但如果您在Dictionary<int, string>类中创建Agent并使用1到10之间的键定义KeyValuePairs并且相应的值对应,则会更容易那些钥匙。这是一个例子:

public class Agent
{
    public Dictionary<int, string> Lab = new Dictionary<int, string>();

    public Agent()
    {
        this.Lab.Add(1, "Value 1");
        this.Lab.Add(2, "Value 2");
        this.Lab.Add(3, "Value 3");

        // ...

        this.Lab.Add(10, "Value 10");
    }
}

然后你可以这样称呼它:

var agent = new Agent();
for (int i = 1; i <= 10; i++)
    tlp.Controls["txtFieldLabel" + i].Text = agent.Lab[i];

答案 2 :(得分:0)

你可以获得物业&#39;使用反射的值:

var agent = new Agent();
//...
var value = agent.GetType().GetProperty("lab" + i).GetValue(agent);

(注意:Agent是类名,而agent是变量/实例)

另一个(更好/更清洁?)解决方案可能是将实验室属性实现为数组或List<string>,例如:

class Agent {
    public List<string> Labs {get;set;}
}

然后你可以迭代所有实验室:

for (var i=0; i<agent.Labs.Count; i++) {
    tlp.Controls["txtFieldLabel" + (i+1)].Text =
        agent.Labs[i];
}

答案 3 :(得分:0)

  

这似乎应该相当简单,类似于运营商的左侧。

一点都不简单;你可以使用reflection来做,但那是非常高级的编程。

我怀疑您可以获得比lab1lab2等更有意义的属性名称,并且强烈建议您使用它们。任何必须在几个月内回到此代码的人都将不胜感激。