C# 如何动态添加xmlclude属性

C# 如何动态添加xmlclude属性,c#,.net,xml-serialization,xmlinclude,C#,.net,Xml Serialization,Xmlinclude,我有以下课程 [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 stat

我有以下课程

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

var type = typeof (AList);
但是没有用。它仍然给出了同样的例外


有人知道如何实现它吗?

看看XmlSerializer的文档。有一个构造函数期望已知类型作为第二个参数。这对您的用例来说应该很好。

我不认为属性可以在运行时应用,因为它们用于在CIL代码中创建元数据。

两个选项;最简单的(但给出了奇怪的xml)是:

使用示例输出:

<AList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ListOfBs>
    <B />
    <B xsi:type="C" />
  </ListOfBs>
</AList>
<AList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <b />
  <c />
</AList>
使用示例输出:

<AList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ListOfBs>
    <B />
    <B xsi:type="C" />
  </ListOfBs>
</AList>
<AList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <b />
  <c />
</AList>


在这两种情况下,您必须缓存并重新使用
ser
实例;否则,动态编译会导致内存大量流失。

基于Marc的第一个答案(我只需要阅读,所以我不需要阻止奇怪的输出),我使用了一个更动态/泛型的类型数组来解释未知类型,这一点启发了我


(有人可能会提高它的效率,例如使用静态或只读类型数组代替局部变量。这样可以避免重复使用反射。但我对程序集何时加载、类和属性何时初始化知之甚少,不知道这是否会给您带来麻烦。我的用法不多,需要考虑到是时候研究这一切了,所以我只是多次使用同一个反射。)

我尝试了这一次,但它给了我以下例外“XmlRoot和XmlType属性可能没有为XmlTest.AList类型指定。”知道它为什么会出现以及如何解决它吗?@Anidya-这很奇怪;示例“按原样”对我来说很好。你使用的是什么框架版本?@Anindya-我已经在4.0和2.0(包括3.0和3.5)上试过了无法复制。您能更完整地描述一下吗?我正在疯狂地寻找一个
xmldattributes
属性,它接受
xmlcludeAttribute
。我从来没有想过改用
xmlementAttribute
。谢谢。
<AList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <b />
  <c />
</AList>
    public static XmlSerializer GetSerializer()
    {
        var lListOfBs = (from lAssembly in AppDomain.CurrentDomain.GetAssemblies()
                           from lType in lAssembly.GetTypes()
                           where typeof(B).IsAssignableFrom(lType)
                           select lType).ToArray();
        return new XmlSerializer(typeof(AList), lListOfBs);
    }