注意:没有指定语言,但看起来像是C#。在本答案中,我假设使用C#。
您试图做什么并不是很清楚,但我会尝试解决。首先,您需要发布您正在使用的实际代码。该代码甚至无法编译,其中充满了语法错误。
让我们先看看您的对象:
class Item
{
List<ItemFeature> features;
}
class ItemFeature
{
public int SerialNo
{
get { return serialno; }
set { serialno = value; }
}
public int Weight
{
get { return weight; }
set { weight = value; }
}
}
您有一个自定义类,其中包含序列号(整数)和重量(整数)。然后您有另一个自定义类,它由列表组成。
现在看起来您正在尝试向添加新的,然后循环遍历所有并再次设置它们?也许是这样的:
Item value = new Item();
value.features.Add(new ItemFeature { SerialNo = int.Parse(serialtextbox.Text) } );
foreach (var item in value.features)
{
item.SerialNo = int.Parse(serialtextbox.Text);
}
(请注意,这段代码可能像你的代码一样随意,所以我没有测试它或任何东西。)
我改变的是:
- 设置SerialNo属性,而不是尝试直接将ItemFeature设置为一个值。您需要深入对象的属性才能在该属性上设置值,而不仅仅是将其设置为整个对象。
- 将输入(字符串)转换为属性的类型(int)。
- 循环遍历列表,而不是Item对象本身。Item对象作为属性包含列表,但对象本身不是列表。您可以通过属性循环遍历,而不是通过父对象。
一些需要询问/注意的事项:
- 你到底想做什么?你有一个对象列表,但你只设置了一个,然后循环遍历它来再次设置它。为什么?
- 你可能需要考虑更合适的类/属性名称。像“Item”这样的东西可能不太清楚。
- 你的“Item”类有一个公共变量“features”。这通常是被反对的。最好使用属性。这样,如果您必须在其后面添加逻辑,就不会破坏对象本身之外的兼容性。像“ItemFeature”类中的属性一样,这是很好的。如果你愿意,它们可以通过使用自动属性进一步缩短,只是为了保持简洁和简单。
- 请注意,我的代码没有对“serialtextbox.Text”值进行任何输入检查。这应该是的。我以更简单的形式呈现它,作为介绍性方法的一部分,以便在理想条件下工作。但以下内容会更好:
var serialValue = 0;
if (!int.TryParse(serialtextbox.Text, out serialValue))
{
return;
}
var value = new Item();
value.features.Add(new ItemFeature { SerialNo = serialValue } );
编辑:我刚刚注意到我的.Add()
调用实际上会失败。在尝试使用列表之前,您需要初始化它。考虑将Item
类更改为以下内容:
class Item
{
public List<ItemFeature> features { get; set; }
public Item()
{
features = new List<ItemFeature>();
}
}
这里有两个变化:
- 我将公共成员转换为属性,如前所述。
- 我添加了一个构造函数,用于初始化列表,以便可以使用它。否则,作为引用类型,它将默认为
null
。因此,对列表上的任何调用.Add()
或任何其他方法都会抛出NullReferenceException
,因为没有对象可调用该方法。