首先,由于您的标志设置是固定的,因此我不会在您的monster
课程中推荐List<flag>
。相反,我将有一个单一的flag
对象,像这样:
[XmlRoot("monster")]
public class monster
{
public flags flags { get; set; }
}
public class flags
{
public int summonable { get; set; }
public int attackable { get; set; }
// Add more as required.
}
现在,需要序列化这XML,你可以介绍你与你的固定属性的名称和值填充public Flag[] Flags
属性。这反过来又可以有你的属性名称和值填充一个[XmlAnyAttribute]
属性阵列,像这样:
[XmlRoot("monster")]
public class monster
{
public flags flags { get; set; }
}
public class flags
{
const string SummonableName = "summonable"; // In c# 6.0 use nameof(summonable)
const string AttackableName = "attackable"; // See https://msdn.microsoft.com/en-us/library/dn986596.aspx
[XmlIgnore]
public int summonable { get; set; }
[XmlIgnore]
public int attackable { get; set; }
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
[XmlElement("flag")]
public Flag[] Flags
{
get
{
return new[]
{
new Flag { Name = SummonableName, Value = XmlConvert.ToString(summonable) },
new Flag { Name = AttackableName, Value = XmlConvert.ToString(attackable) },
};
}
set
{
if (value == null)
return;
foreach (var attr in value)
{
if (attr.Name == SummonableName)
summonable = XmlConvert.ToInt32(attr.Value);
else if (attr.Name == AttackableName)
attackable = XmlConvert.ToInt32(attr.Value);
}
}
}
}
public class Flag
{
[XmlIgnore]
public string Name { get; set; }
[XmlIgnore]
public string Value { get; set; }
[XmlAnyAttribute]
public XmlAttribute[] XmlAttributes
{
get
{
var attr = new XmlDocument().CreateAttribute(Name.ToString());
attr.Value = Value;
return new [] { attr };
}
set
{
if (value == null || value.Length == 0)
{
Name = null;
Value = null;
}
else if (value.Length == 1)
{
Name = value[0].Name;
Value = value[0].Value;
}
else
{
throw new ArgumentException("Too many attributes");
}
}
}
}
然后XML将看起来像:
<monster>
<flags>
<flag summonable="0" />
<flag attackable="0" />
</flags>
</monster>
样品fiddle。
来源
2016-09-16 20:31:55
dbc
固定标志值集合(即只有'summonable'和'attackable')还是可以有任何数量的标志? – dbc
只能召唤和攻击 –
如果是这样的话,为什么不让他们成为你自己的元素?例如, 和 ? –
Thumper