C# Can';t通过多个类层访问数据

C# Can';t通过多个类层访问数据,c#,class,C#,Class,对于我的项目,我必须构建一个数据结构来表示xml文件。 我的想法是使用多个类来表示不同的xml层 我现在的问题是如何从最底层更改最底层的数据。 在我的代码示例中,有三个调用2工作1不工作。为什么最后一个不起作用 有没有其他方法来组织数据 public class option { public string optionID; public void setoptionID(string text) { optionID = text; } }

对于我的项目,我必须构建一个数据结构来表示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      
    }

}

对我来说,这三种说法都不管用。 您必须初始化对象本身,而不仅仅是数组

items[0] = new catalogitem();
items[0].setShortName("asdf");      
items[0].modul[0] = new module();
items[0].modul[0].setmoduleID("5");   
但我也建议您在类和方法中使用属性而不是setShortName()/setmoduleID()来添加和初始化子项

当然,这取决于规范/您的意图(我不知道),但这里有一种可能的实现方法 目录项。您可以读/写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);
    }
 }
公共类目录项
{
私有只读列表mModuls;
公共IEnumerable模
{
获取{return mModuls;}
}
公共字符串短名称{get;set;}
公共目录项()
{
mModuls=新列表();
}
公共无效添加模块(模块)
{
//添加一个模块已分配的检查。
mModuls.Add(模块);
}
}
一些建议

  • 使用属性而不是集合方法
  • 仅写属性在设计上并不好
  • 如果只需要一个类型的对象,请创建该对象,而不是使用1个对象创建数组
  • 遵循命名约定和
下面是您的更新代码

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";
        }
    }
}
公共类选项
{
公共字符串OptionID{get;set;}
}
公共类模块
{
//如果只需要一个选项,为什么不创建一个公共选项对象,而不是数组
公共选项=新选项();
公共字符串ModuleID{get;set;}
}
公共类目录项
{
公共模块=新模块();
公共字符串短名称{get;set;}
}
公共级卡塔洛
{
私有列表项=新列表();
公共卡塔洛语()
{
对于(int i=0;i<10;i++)
添加(新目录项());
}
public void SetCatalogItem()
{
foreach(项目中的目录项目ci)
{
ci.ShortName=“asdf”;
ci.Module.ModuleID=“5”;
}
}
}


很乐意帮忙!如果您觉得答案有帮助,请记住接受它。

您能定义“不工作”吗?另外,您的代码没有按照posted编译。VS 2013说我不能按实例调用它,但我应该按类型名调用它。(我不能发布完整的信息,因为它是德语)它刚刚开始工作。我不知道为什么。您的评论是错误的,catalogitem.modul[0]。setmoduleID(“5”)将显示编译时错误,因为模块不是静态的,它需要创建catalogitem的对象……。而项[0]。modul[0]。setmoduleID(“5”)将无法工作,因为模块[0]仍然为空……。顺便说一句,在我的回答中,我提供了一些建议。您能否不使用类文件定义XML对象,然后使用XmlDocument类创建一个具有构建XML函数的实用程序类,该类将基于您的类层次结构构建XML对象?