我有一个名为“Agent”的对象。代理商拥有10个名为lab1至lab10的物业。我需要将这些属性分配给表单txtFieldLabel1到txtFieldLabel10上的文本框。在下面的例子中,循环中操作符的左侧很好。我无法弄清楚右侧。我需要根据循环的索引动态构建属性名称。这似乎应该相当简单,类似于运算符的左侧。
for (int i = 1; i <= 10; i++)
{
tlp.Controls["txtFieldLabel" + i.ToString()].Text = Agent.lab + i.ToString();
}
答案 0 :(得分:1)
Agent.GetType().GetProperty("lab" + i).GetValue(Agent, null);
这将获得使用反射定义为labX
的属性的值,其中X
是i
的值。
编辑:更改为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来做,但那是非常高级的编程。
我怀疑您可以获得比lab1
,lab2
等更有意义的属性名称,并且强烈建议您使用它们。任何必须在几个月内回到此代码的人都将不胜感激。