将自定义类转换为列表<>

本文关键字:列表 转换 自定义 | 更新日期: 2023-09-27 18:02:07

>场景:我有一个 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; }
    }

}

请帮帮我

将自定义类转换为列表<>

注意:未指定语言,但它看起来像 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; }
  }
}

您有一个自定义类 ItemFeature ,它由序列号(整数(和权重(整数(组成。 然后,您将拥有另一个自定义类 Item ,它由 ItemFeature 的列表组成。

现在看起来您正在尝试向Item添加新ItemFeature,然后遍历所有这些并再次设置它们?。 也许是这样的东西?

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. 将输入(字符串(转换为属性的类型(整数(。
  3. 循环遍历列表,而不是Item对象本身。 Item对象包含一个列表作为属性,但对象本身不是列表。 可以遍历属性,而不是遍历父对象。

要问/注意的几件事:

  1. 你到底想做什么? 您有一个对象列表,但您只设置了一个对象,然后循环访问该对象以再次设置它。 为什么?
  2. 您可能需要考虑更合适的类/属性名称。 像"项目"这样的东西可能有点不清楚。
  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,因为没有要调用方法的对象。