c#如何以编程方式构建属性名
本文关键字:构建 属性 方式 编程 | 更新日期: 2023-09-27 18:05:13
我有一个名为"Agent"的对象。Agent有10个属性,命名为lab1到lab10。我需要通过txtFieldLabel10将这些属性分配给表单txtFieldLabel1上的文本框。在下面的示例中,循环中操作符的左侧是可以的。我不知道右边是多少。我需要根据循环的索引动态地构建属性名。这看起来应该相当简单,类似于操作符的左侧。
for (int i = 1; i <= 10; i++)
{
tlp.Controls["txtFieldLabel" + i.ToString()].Text = Agent.lab + i.ToString();
}
Agent.GetType().GetProperty("lab" + i).GetValue(Agent, null);
这将得到属性的值,使用反射,定义为labX
,其中X
是i
的值。
编辑:更改为GetValue(Agent, null)
而不是GetValue(Agent)
,因为在。net 4.5中引入了单对象参数的重载
您可以像其他人提到的那样使用反射,但是如果您在Agent
类中创建Dictionary<int, string>
,并使用从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];
这看起来应该相当简单,类似于操作符的左侧。
这一点都不简单;您可以使用反射来实现,但这是相当高级的编程。
我怀疑有比lab1
, lab2
等更有意义的属性名可供您使用,强烈建议您使用它们。几个月后再来看这段代码的人会很感激的。
您可以使用反射获取属性的值:
var agent = new Agent();
//...
var value = agent.GetType().GetProperty("lab" + i).GetValue(agent);
(注:Agent
为类名,agent
为变量/实例)
另一个(更好/更干净?)的解决方案可能是实现lab-properties作为数组或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];
}