私は次のクラスを持っています
[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);
しかし、役に立たない。それはまだ同じ例外を与えています。
誰もそれを達成する方法について何か考えがありますか?