Tôi có các lớp sauLàm thế nào để thêm thuộc tính XmlInclude động
[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);
}
}
Bây giờ khi tôi cố gắng chạy đoạn code tôi có một InvalidOperationException ở dòng cuối cùng nói rằng
Loại XmlTest.C không được trông đợi . Sử dụng thuộc tính XmlInclude hoặc SoapInclude để chỉ định các kiểu không được biết đến tĩnh.
Tôi biết rằng việc thêm thuộc tính [XmlInclude (typeof (C))] với [XmlRoot] sẽ giải quyết được sự cố. Nhưng tôi muốn đạt được nó một cách năng động. Bởi vì trong lớp C dự án của tôi không được biết trước khi tải. Lớp C đang được tải dưới dạng plugin, vì vậy tôi không thể thêm thuộc tính XmlInclude vào đó.
Tôi cũng đã cố gắng với
TypeDescriptor.AddAttributes(typeof(AList), new[] { new XmlIncludeAttribute(c.GetType()) });
trước
var type = typeof (AList);
nhưng không sử dụng. Nó vẫn cho cùng một ngoại lệ.
Có ai có ý tưởng nào về cách đạt được điều đó không?
Tôi đã thử cách này nhưng nó cho tôi ngoại lệ sau đây "Thuộc tính XmlRoot và XmlType có thể không được chỉ định cho loại XmlTest.AList." Bất kỳ ý tưởng nào tại sao lại đến và cách giải quyết? –
@Anindya - đó là lẻ; ví dụ "as is" hoạt động tốt cho tôi. Bạn đang sử dụng phiên bản khung công tác nào? –
@Anindya - Tôi đã thử trên 4.0 và 2.0 (bao gồm 3.0 và 3.5) và không thể tái tạo. Bạn có thể mô tả đầy đủ hơn về điều này không? –