У меня есть следующие классы
[XmlRoot]
public class AList
{
public List<B> ListOfBs {get; set;}
}
public class B
{
public string BaseProperty {get; set;}
}
public class C : B
{
public string SomeProperty {get; set;}
}
public class Main
{
public static void Main(string[] args)
{
var aList = new AList();
aList.ListOfBs = new List<B>();
var c = new C { BaseProperty = "Base", SomeProperty = "Some" };
aList.ListOfBs.Add(c);
var type = typeof (AList);
var serializer = new XmlSerializer(type);
TextWriter w = new StringWriter();
serializer.Serialize(w, aList);
}
}
Теперь, когда я пытаюсь запустить код, на последней строке я получил InvalidOperationException, в котором говорится, что
Тип XmlTest.C не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.
Я знаю, что добавление атрибута [XmlInclude (typeof (C))] с помощью [XmlRoot] решит проблему. Но я хочу добиться этого динамично. Потому что в моем проекте класс C не известен до загрузки. Класс C загружается как плагин, поэтому мне не удается добавить туда атрибут XmlInclude.
Я попробовал также с
TypeDescriptor.AddAttributes(typeof(AList), new[] { new XmlIncludeAttribute(c.GetType()) });
до
var type = typeof (AList);
но не используется. Он по-прежнему дает то же исключение.
Есть ли у кого-нибудь идеи о том, как его достичь?