#if区域不工作

本文关键字:工作 区域 #if | 更新日期: 2023-09-27 17:51:09

我想使用#if语句,当val2为真时跳过序列化val,当val2为假时序列化val。但我的代码似乎不工作:

#if val2
    [XmlIgnore]
#else   
    [XmlElement(ElementName = "val")]
#endif
public bool val
{
    { get; set; } = false;
}
[XmlElement(ElementName = "val2")]
public bool val2
{
    { get; set; } = true;
}

我要怎么做才能让它工作?由于

#if区域不工作

我认为你需要定义你正在用#define测试的符号。这些是预处理器指令,你不能使用普通的属性名等,因为它们在编译过程中起作用,这发生在预处理之后。

这是来自标准:

预处理表达式的求值总是产生一个布尔值。预处理表达式的求值规则与常量表达式的求值规则相同(§7.19),除了唯一可以引用的用户定义实体是条件编译符号。

正如这个问题所指出的,你需要这样做:

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();
}

只要在您的代码中添加以下选项之一,当val2为true时,val将不会被序列化:

public bool ShouldSerializeval()
{
    return val2 == false;
}

public bool ShouldSerializeval()
{
    return !val2;
}