通过包含对象名称的指定部分的字符串(或整数)引用对象的属性 - C#



例如,我有一个返回值"4"的方法...我的按钮名称是"b4"。我想根据该方法返回的数字来更改该 b"X" 的 Text 属性。在 C# 中执行此操作的最简单方法。我是初学者,所以请好好解释一下...我知道这可能是一个重复的帖子。但我不明白所有类似帖子中的答案。代码的布局如下所示:

我有一个由五个数字组成的数组(例如"int[] rnum = {1, 6, 7, 3, 8}")...我还有 5 个按钮,应该根据数组中给出的整数被禁用......我有 25 个按钮,它们的名称如下"b1、b2、b3、b4....等等"。那么通过引用按钮对象的名称和数组中给出的整数来更改按钮的"启用"属性的最简单方法是什么......例如 rnum[1] = 6 ==> b6。已启用 = 假...我知道我可以做出切换语句,但如果有很多按钮,我该如何自动化呢?

正如@Alex K.所提到的。

public Button GetButtonByIndex(int index)
{
  return (Button)this.Controls.Find("b" + index, true).FirstOrDefault();
}

然后GetButtonByIndex(1)会返回b1,等等。

您可以使用反射来做到这一点。 下面是一个示例:

class Foo
{
    public int Bar1 { get; set; }
    public int Bar2 { get; set; }
    public Foo()
    {
        Bar1 = 2;
        Bar2 = 3;
    }
    public int GetBar(int barNum) //return type should be Button for you
    {
        PropertyInfo i = this.GetType().GetProperty("Bar"+barNum);
        if (i == null)
            throw new Exception("Bar" + barNum + " does not exist");
        return (int)i.GetValue(this); //you should cast to Button instead of int
    }
}

和主要:

class Program
{
    static void Main(string[] args)
    {
        Foo f = new Foo();
        for (int i = 1; i <= 3; i++)
            try
            {
                Console.WriteLine(f.GetBar(i));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        Console.ReadLine();
    }
}

输出将是:

2
3
Bar3 does not exist

请注意,当我打印foo.GetBar(i)的结果时,您可以在您的情况下执行以下操作: foo.GetButton(i).Enabled = false;

虽然在Controls(递归或已知容器)中查找按钮会起作用,但更简单的解决方案(通常)是这样的

var buttons = new[] {b1, b2, b3, b4, b5 }; // can be a field initialized in form constructor
buttons[number - 1].Text = "lalala"; // number is from 1 to 5

如果您不想将收到的number转换为index,则可以将null作为第一个元素添加到数组中。

最新更新