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

时间:2011-07-15 17:02:09

标签: c# list

方案: 我有一个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; }
    }

}

Plz帮帮我

1 个答案:

答案 0 :(得分: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; }
  }
}

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

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

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对象包含列表作为属性,但对象本身不是列表。您可以遍历该属性,而不是通过父对象。
  4. 要问一些事项/注意:

    1. 你究竟想做什么?你有一个对象列表,但你只是设置一个,然后循环通过那个对象再次设置它。为什么?
    2. 您可能需要考虑更多apt类/属性名称。 “项目”之类的东西可能有点不清楚。
    3. 您的Item班级有一个公共变量features。这通常是不赞成的。最好使用一个属性。这样,如果您必须在其后面添加逻辑,则不会破坏对象本身之外的兼容性。 ItemFeature类具有这样的属性,这很好。如果您愿意,可以使用automatic properties进一步缩短它们,只是为了保持简洁。
    4. 请注意,我的代码没有对serialtextbox.Text值进行任何输入检查。它应该是。我以简单的形式介绍了它,作为在理想条件下工作的介绍性方法。但是像下面这样的东西会更好:
    5. 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,因为没有对象可以调用方法。