我使用silverlight并使用c#代码进行序列化。
我有一个parameters
课程,里面有parameter
和separator
个列表:
[XmlRoot(ElementName = "parameters")]
public class Parameters
{
[XmlElement("separator")]
public List<Separator> Separator { get { return a1; } }
private readonly List<Separator> a1 = new List<Separator>();
[XmlElement("parameter")]
public List<Parameter> Parameter { get { return b1; } }
private readonly List<Parameter> b1 = new List<Parameter>();
}
再次在Parameter类中我有:
[XmlElement("name")]
public string Name { get; set; }
还有:
[XmlElement("component")]
public List<Component> Component { get { return b3; } }
private readonly List<Component> b3 = new List<Component>();
等等。
现在我在主函数中使用XmlWriter:
public void Main()
{
Parameters[] prs = new Parameters[4];
prs[0] = new Parameters();
prs[1] = new Parameters();
prs[2] = new Parameters();
prs[0].Parameter[0].Name = "shek1";
prs[0].Parameter[0].Component[0].Type = "type1";
prs[1].Separator[0].Separators = "sep1";
prs[2].Parameter[0].Name = "shek2";
prs[2].Parameter[0].Component[0].Type = "type2";
StringBuilder output = new StringBuilder();
XmlWriterSettings ws = new XmlWriterSettings();
ws.Indent = true;
using (XmlWriter writer = XmlWriter.Create(output, ws))
{
writer.WriteStartDocument();
writer.WriteStartElement("Parameters");
int count = 0;
foreach (var param in prs)
{
writer.WriteStartElement("Parameter");
writer.WriteElementString("Name", param.Parameter[count].Name);
writer.WriteStartElement("Component");
writer.WriteElementString("Type", param.Parameter[count].Component[0].Type);
writer.WriteStartElement("Attribute");
writer.WriteElementString("Items", param.Parameter[count].Component[0].Attributes[0].Items[count]);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
我遇到的错误是Index was out of range. It must not be negative and must be less than the size of the collection.
行prs[0].Parameter[0].Name = "shek1";
。
我知道问题出在Parameters类中。我有Parameter类,如果我将任何值赋给Parameters类的字段,它会工作,但是当我转到Parameter类时,它的索引超出范围错误。
如何解决这个问题?
答案 0 :(得分:3)
索引超出范围,因为你有一个空数组。并且您无法从空数组中访问元素,因为它没有元素。
在这里,您可以创建Parameters
个对象的数组:
Parameters[] prs = new Parameters[4];
prs[0] = new Parameters();
prs[1] = new Parameters();
prs[2] = new Parameters();
此时你有一个4个元素的Parameters
个数组,其中3个有一个有效的Parameters
个对象(由于某些原因,第4个为空)。现在每个Parameters
对象都有一个Parameter
属性(顺便说一句,这让我感到很困惑,我建议使用更好的类型/变量命名):
public List<Parameter> Parameter { get { return b1; } }
private readonly List<Parameter> b1 = new List<Parameter>();
所以Parameter
属性是new List<Parameter>()
,这是一个空列表。然后,您尝试从空列表中访问元素:
prs[0].Parameter[0].Name = "shek1";
prs[0]
是Parameter
个对象,但.Parameter
为空List<Parameter>
。它在索引0
没有元素。因此错误。
如果您需要初始化List<Parameter>
对象中的Parameter
,那么就可以像创建Parameter
数组时那样在该对象中执行此操作。或者你可以在你使用它的地方添加一个:
prs[0].Parameter.Add(new Parameter());
prs[0].Parameter[0].Name = "shek1";
答案 1 :(得分:1)
这是因为当您调用prs[0].Parameter[0].Name = "shek1";
时,Parameter
属性是一个空列表(private readonly List<Parameter> b1 = new List<Parameter>();
),因此是一个列表但包含零元素。
您需要先添加一个元素,然后分配如下名称:
prs[0].Parameter.Add(new Parameter());
prs[0].Parameter[0].Name = "shek1";
prs[0].Parameter[0].Component[0].Type = "type1";
或者简化为:
prs[0].Parameter.Add(new Parameter
{
Name = "shek1",
Type = "type1"
});
您需要对其他来电重复此操作,因此要prs[1]
和prs[2]
等,但希望您明白这一点。