繁体   English   中英

创建动态类对象

[英]create Dynamic class object

我正在学习C#,现在我被动态对象所困(如果有这样的事情)。

我在一个用户窗体上有两个Button和两个TextBoxes,所以我想做的是每次单击Button1并将其name属性值分配给TextBox1中的任何文本时实例化一个对象。 在几个实例之后,我想检索任何已创建对象的名称值(类似于MessageBox.Show(obj[int.Parse(TextBox2.text)].name) )。

代码抛出错误:

System.NullReferenceException:'对象引用未设置为对象的实例。

TEST[] o;

private void Button1_Click(object sender, EventArgs e)
{
    o = new TEST[10];
    o[1].name = textBox1.Text;
}

private void Button2_Click(object sender, EventArgs e)
{
    MessageBox.Show(o[1].xcount.ToString());
}

我想按对象索引/计数读取特定对象的属性值。

在这里,您每次都实例化Test类的数组。 创建一个名为Name的类(而不是动态类),该属性将在每次单击按钮时存储textbox1值。

单击Button2时,使用该属性检索名称。

Test[] testArray = new Test[10];
int index = 0;

private void Button1_Click(object sender, EventArgs e)
{
   if(index < 10)  //To avoid ArrayIndexOutOfBound error
   {
      testArray[index++] = new Test() { Name = textBox1.Text };
   }

}
private void Button2_Click(object sender, EventArgs e)
{
    //Read Name of first element in an array
    string firstName = testArray.FirstOrDefault()?.Name;
    MessageBox.Show(firstName);
}


public class Test
{
   public string Name { get; set; }
}

您选择使用数组是正确的方法之一。

首先,应将数组的初始化移到方法外,以免每次按按钮1时都不会创建新数组(因此会丢弃旧对象):

TEST[] o = new TEST[10];
private void Button1_Click(object sender, EventArgs e)
{
    // ...
}

接下来,添加一个变量,该变量指示将下一个元素添加到数组的位置:

int next = 0;
TEST[] o = new TEST[10];
private void Button1_Click(object sender, EventArgs e)
{
    // ...
}

Button1_Click内部,您需要创建一个name textBox1.TextTEST对象,将其分配给o[next] ,然后递增next以便可以插入下一个元素。

o[next] = new TEST { name = textBox1.Text };
next++;

尝试弄清楚如何实现Button2_Click

显然,该程序只能存储固定数量的TEST对象。 如果要存储未知数量的对象,则需要List<TEST>

List<TEST> o = new List<TEST>();
private void Button1_Click(object sender, EventArgs e)
{
    o.Add(new TEST{ name = textBox1.Text });
}

创建数组TEST它将包含10个位置,所有位置都包含null 您必须首先创建TEST对象

o = new TEST[10];
// o[1] is null here.
o[1] = new TEST(); // Create object.
o[1].name = textBox1.Text;

要么

o = new TEST[10];
TEST test = new TEST();
test.name = textBox1.Text;
o[1] = test;

或者,使用对象初始化程序

o = new TEST[10];
o[1] = new TEST{name = textBox1.Text};

但是请注意,数组索引是从零开始的。 即,数组的第一个元素为o[0] ,最后一个为o[9]

另外,请注意, Button1_Click方法每次都会创建一个新数组,因此会丢弃之前存储的所有值。

首先,您的Button1_Click会重置每次单击的o数组。 您想要做的是将其移到那里,可能是在初始化方法中,或者在构造函数中。 全球宣言也可以。

其次,System.NullReferenceException:“对象引用未设置为对象的实例。” 因为尝试访问尚未定义的阵列插槽而抛出该异常。

    o = new TEST[10]; //new array here
    o[1].name = textBox1.Text; //and then you access slot[1] immediately

您要做的是首先设置slot [1]。

   o[1] = new Test();

为了避免将来出现此错误,您需要确保在访问插槽之前已实例化该插槽。

   if (slot[i] != null)
   {   slot[i].name = "nam"; }

感谢大家,您的输入帮助我编写了一个很棒的程序,作为开始:int next = 0; TEST [] o =新的TEST [10]; 私人void Button1_Click(object sender,EventArgs e){o [next] =新的TEST {name = textBox1.Text}; 下++; } private void Button2_Click(object sender,EventArgs e){MessageBox.Show(o [int.Parse(textBox2.Text)]。name); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM