How to add XmlInclude attribute dynamically

Posted by Anindya Chatterjee on Stack Overflow See other posts from Stack Overflow or by Anindya Chatterjee
Published on 2010-04-22T09:23:06Z Indexed on 2010/04/22 9:23 UTC
Read the original article Hit count: 356

Filed under:
|
|
|

I have the following classes

[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);
    }    
}

Now when I try to run the code I got an InvalidOperationException at last line saying that

The type XmlTest.C was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

I know that adding a [XmlInclude(typeof(C))] attribute with [XmlRoot] would solve the problem. But I want to achieve it dynamically. Because in my project class C is not known prior to loading. Class C is being loaded as a plugin, so it is not possible for me to add XmlInclude attribute there.

I tried also with

TypeDescriptor.AddAttributes(typeof(AList), new[] { new XmlIncludeAttribute(c.GetType()) });

before

var type = typeof (AList);

but no use. It is still giving the same exception.

Does any one have any idea on how to achieve it?

© Stack Overflow or respective owner

Related posts about c#

Related posts about .NET