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