将自定义类转换为List<>

3

场景: 我有一个Web表单,从中输入Item类的值,现在我想为返回类型为列表的特征分配值,我该如何做。

item value = new item(),
value.feature = serialtextbox.text; //error

foreach ( var item in value) //error 
{
 item.SerialNo= serialtextbox.text; 
}

项目和项目要素类

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

请帮我解决问题


1
请您是否能显示完整的代码片段?这是哪种编程语言?您第一行中的逗号是什么意思? - undefined
是的,你在第一个句子末尾有一个逗号...很可能是导致错误的原因。 - undefined
1个回答

5
注意:没有指定语言,但看起来像是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); 
}

(请注意,这段代码可能像你的代码一样随意,所以我没有测试它或任何东西。)

我改变的是:

  1. 设置SerialNo属性,而不是尝试直接将ItemFeature设置为一个值。您需要深入对象的属性才能在该属性上设置值,而不仅仅是将其设置为整个对象。
  2. 将输入(字符串)转换为属性的类型(int)。
  3. 循环遍历列表,而不是Item对象本身。Item对象作为属性包含列表,但对象本身不是列表。您可以通过属性循环遍历,而不是通过父对象。

一些需要询问/注意的事项:

  1. 你到底想做什么?你有一个对象列表,但你只设置了一个,然后循环遍历它来再次设置它。为什么?
  2. 你可能需要考虑更合适的类/属性名称。像“Item”这样的东西可能不太清楚。
  3. 你的“Item”类有一个公共变量“features”。这通常是被反对的。最好使用属性。这样,如果您必须在其后面添加逻辑,就不会破坏对象本身之外的兼容性。像“ItemFeature”类中的属性一样,这是很好的。如果你愿意,它们可以通过使用自动属性进一步缩短,只是为了保持简洁和简单。
  4. 请注意,我的代码没有对“serialtextbox.Text”值进行任何输入检查。这应该是的。我以更简单的形式呈现它,作为介绍性方法的一部分,以便在理想条件下工作。但以下内容会更好:

var serialValue = 0;

if (!int.TryParse(serialtextbox.Text, out serialValue))
{
  // Here you would probably present an error to the user stating that the form field failed validation.
  // Maybe even throw an exception?  Depends on how you handle errors.
  // Mainly, exit the logic flow.
  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>();
  }
}

这里有两个变化:

  1. 我将公共成员转换为属性,如前所述。
  2. 我添加了一个构造函数,用于初始化列表,以便可以使用它。否则,作为引用类型,它将默认为null。因此,对列表上的任何调用.Add()或任何其他方法都会抛出NullReferenceException,因为没有对象可调用该方法。

它将生成一个错误值。value.features.Add(new ItemFeature { SerialNo = serialValue }); 对象引用未设置为对象的实例。我通过创建一个list<itemfeature>的实例来解决这个问题,然后在其中添加itemfeature的实例,并最后将其分配给.value.features = list<itemfeature>实例。 - undefined
@user751959:正确的,看一下我对答案的最后修正。比创建一个新实例更好的解决方案是在类的构造函数中创建实例,这样它会自动发生。否则,每次使用该类的实例时都必须手动创建一个实例,这是不必要的。 - undefined
你对于提供如此详尽的答案应该得到一些认可。很明显你在这里花了不少时间,虽然这不是我的问题,但我还是很感激你的付出。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接