我想使用#if
语句跳过val
为真时序列化val2
,并在val
为假时序列化val2
。但我的代码似乎不起作用:
#if val2
[XmlIgnore]
#else
[XmlElement(ElementName = "val")]
#endif
public bool val
{
{ get; set; } = false;
}
[XmlElement(ElementName = "val2")]
public bool val2
{
{ get; set; } = true;
}
我需要做些什么才能让它正常工作?感谢
答案 0 :(得分:1)
我认为您需要使用#define
定义要测试的符号。这些是预处理器指令,你不能使用正常的属性名称等,因为它们在编译期间在预处理之后发生。
这来自标准:
预处理表达式的评估总是产生一个布尔值。预处理表达式的评估规则与常量表达式(第7.19节)的评估规则相同,只是可以引用的唯一用户定义实体是条件编译符号。
正如this questio n所指出,你需要这样的东西:
public class Item
{
public bool val { get; set; }
public bool ShouldSerializeval()
{
return !val2;
}
[XmlElement(ElementName = "val2")]
public bool val2 { get; set; }
}
void Main()
{
Item item = new Item(){val=true, val2=true};
XmlSerializer xs = new XmlSerializer(typeof(Item));
StringWriter sw = new StringWriter();
xs.Serialize(sw, item);
sw.ToString();
}
答案 1 :(得分:0)
只需在代码中添加以下内容之一,val
为真时,val2
将不会被序列化:
public bool ShouldSerializeval()
{
return val2 == false;
}
或
public bool ShouldSerializeval()
{
return !val2;
}