2015-05-30 3 views
0

Я хочу использовать оператор #if, чтобы пропустить сериализацию val, когда val2 является истинным и сериализует val, когда val2 является ложным. Но мой код, похоже, не работает:#if region не работает

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

[XmlElement(ElementName = "val2")] 
public bool val2 
{ 
    { get; set; } = true; 
} 

Что мне нужно сделать, чтобы заставить его работать? Спасибо

ответ

0

Просто добавьте одно из следующих действий к коду, и val не будет сериализовать, когда val2 верно:

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

или

public bool ShouldSerializeval() 
{ 
    return !val2; 
} 
1

Я думаю, вам нужно определить символ, который вы тестируете, с помощью #define. Это предпроцессорные директивы, и вы не можете использовать обычные имена свойств и т. Д., Поскольку они вступают в игру во время компиляции, которые происходят после предварительной обработки.

Это от стандарта:

Оценка экспрессии в предварительной обработки всегда дает логическое значение. Правила оценки для выражения предварительной обработки такие же, как и для константного выражения (§7.19), , за исключением того, что единственными определяемыми пользователем объектами, на которые можно ссылаться, являются условные символы компиляции.

Как указано в п this questio, вам нужно что-то вроде этого:

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

, но как я могу определить значение, которое показывает мне, если 'val2' является истинным или ложным? –

+0

вы не можете использовать 'val2' в директиве предварительной обработки вообще. Вы пытаетесь скрыть 'val', если' val2' истинно? –

+0

да, это то, чего я пытаюсь достичь. –