无法通过多个类层访问数据

时间:2014-04-28 14:32:02

标签: c# class

对于我的项目,我必须构建一个表示xml文件的数据结构。 我的想法是使用代表不同xml层的多个类。

我现在的问题是如何从最上层更改最低层中的数据。 在我的代码示例中有三个调用2个工作1没有。为什么最后一个不起作用?

是否有另一种组织数据的方式?

public class option
{
    public string optionID;

    public void setoptionID(string text)
    {
        optionID = text;
    }
}

public class module
{
    public option[] opt = new option[1];
    private string moduleID;

    public void setmoduleID(string text)
    {
        moduleID = text;
    }

}

public class catalogitem
{
    public module[] modul = new module[1];
    private string ShortName;

    public void setShortName(string text)
    {
        ShortName = text;
    }
}

public class Katalog
{
    private catalogitem[] items = new catalogitem[1];

    public Katalog()
    {

    }

    public void setcatalogitems()
    {
        items[0].setShortName("asdf");                  //works
        catalogitem.modul[0].setmoduleID("5");          //works
        items[0].modul[0].setmoduleID("5");             //doesn't work      
    }

}

2 个答案:

答案 0 :(得分:2)

对我来说,这三个陈述都不起作用。 您必须初始化对象本身,而不仅仅是数组。

items[0] = new catalogitem();
items[0].setShortName("asdf");      
items[0].modul[0] = new module();
items[0].modul[0].setmoduleID("5");   

但我还建议你在类和方法中使用属性而不是setShortName()/ setmoduleID()来添加和初始化子项。

当然这取决于规格/您的意图(我不知道),但这里有一种可能的实施方式,例如 CatalogItem。您可以读/写ShortName并枚举所有现有模块。我会拿一个列表,而不是数组。模块可以 只是逐个添加,你可以在真正添加之前检查它们:

  public class CatalogItem
  {
    private readonly List<Module> mModuls;

    public IEnumerable<Module> Moduls
    {
      get { return mModuls; }
    }

    public string ShortName { get; set; }

    public CatalogItem()
    {
      mModuls = new List<Module>();
    }

    public void AddModule(Module module)
    {
      // Add a check that module is assigned.

      mModuls.Add(module);
    }
 }

答案 1 :(得分:0)

一些建议

  • 使用属性而不是设置方法
  • 只写设计属性不好
  • 如果只需要一个类型的一个对象,则使用1个对象
  • 创建对象而不是数组
  • 遵循命名惯例C# Coding ConventionsNaming Guidelines

您的更新代码如下所示。

public class Option
{
    public string OptionID { get; set;}
}

public class Module
{
    // if you need only one Option, why not create one public Option object, instead of an Array
    public Option Option = new Option();
    public string ModuleID { get; set; }
}

public class CatalogItem
{
    public Module Module = new Module();
    public string ShortName { get; set; }
}

public class Katalog
{
    private List<CatalogItem> items = new List<CatalogItem>();

    public Katalog()
    {
      for(int i = 0; i < 10; i++)
         items.Add(new CatalogItem());
    }

    public void SetCatalogItem()
    {
        foreach(CatalogItem ci in items)
        {
            ci.ShortName = "asdf";
            ci.Module.ModuleID = "5";
        }
    }
}

很高兴帮忙!如果您觉得有帮助,请记得接受答案。