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();
        }

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

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

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

编辑:更改为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];
}