首先,由於您的標誌設置是固定的,因此我不會在您的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