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