Можно ли добавить атрибут XmlIgnore в производные классы? - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть класс Animal и классы Dog и Cat, унаследованные от него.Класс Animal имеет свойство X. Я хотел бы сгенерировать XML для «Dog» без свойства «X» и для «Cat» со свойством «X».XmlIgnore не работает здесь так, как я ожидал.

Я пытался использовать виртуальное свойство, а затем переопределить его в производном классе, но оно не сработало.

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog();
        Cat cat = new Cat();

        SerializeToFile(dog, "testDog.xml");
        SerializeToFile(cat, "testCat.xml");
    }

    private static void SerializeToFile(Animal animal, string outputFileName)
    {
        XmlSerializer serializer = new XmlSerializer(animal.GetType());

        TextWriter writer = new StreamWriter(outputFileName);
        serializer.Serialize(writer, animal);
        writer.Close();
    }
}
public abstract class Animal
{
    public virtual int X { get; set; }
}
public class Dog : Animal
{
    [XmlIgnore]
    public override int X { get; set; }
}
public class Cat : Animal
{
    public override int X { get; set; }
}

1 Ответ

0 голосов
/ 25 апреля 2019

Даже если вам это больше не нужно, я все же нашел решение этой проблемы.

Вы можете создать XmlAttributeOverrides и установить свойство XmlAttributes.XmlIgnore для определенных полей классов.

private static void SerializeToFile(Animal animal, string outputFileName)
{
    // call Method to get Serializer
    XmlSerializer serializer = CreateOverrider(animal.GetType()); 
    TextWriter writer = new StreamWriter(outputFileName);
    serializer.Serialize(writer, animal);
    writer.Close();
}

// Return an XmlSerializer used for overriding.
public XmlSerializer CreateOverrider(Type type)
{
    // Create the XmlAttributeOverrides and XmlAttributes objects.
    XmlAttributeOverrides xOver = new XmlAttributeOverrides();
    XmlAttributes attrs = new XmlAttributes();

    /* Setting XmlIgnore to true overrides the XmlIgnoreAttribute
     applied to the X field. Thus it won't be serialized.*/
    attrs.XmlIgnore = true;
    xOver.Add(typeof(Dog), "X", attrs);

    XmlSerializer xSer = new XmlSerializer(type, xOver);
    return xSer;
}

Конечно, вы также можете сделать обратное, установив attrs.XmlIgnore в false.

Проверьте этот для получения дополнительной информации.

...