下面是我最近关于将大型复杂对象作为Web服务结果的问题。我一直在考虑如何确保将来的所有子类都可以序列化为XML
现在,很明显,我可以实现IXmlSerializable接口,然后将读写器扔到接口上,但我希望避免这样做,因为这意味着我需要在任何时候实例化读写器,并且99.99%的时间我将使用字符串,所以我可以自己编写
然而,为了序列化为XML,我只是用XML???属性(XmlRoot,xmlement等)装饰类及其成员,然后将其传递给XmlSerializer和StringWriter以获取字符串。这很好。我打算将返回字符串的方法放入一个通用实用程序方法中,这样就不必担心类型等问题
我关心的是:如果我没有用所需的属性装饰类,那么直到运行时才会抛出错误
有没有办法强制属性装饰?这可以用FxCop完成吗?(我还没有用过FxCop)
更新:
抱歉耽搁了这次的收场伙计们,还有很多事要做
绝对喜欢在测试用例中使用反射而不是求助于FxCop(喜欢将所有内容保持在一起)的想法。。Fredrik Kalseth的回答太棒了,谢谢你包含了代码,因为我自己可能需要花点时间去挖掘才能弄明白怎么做
+1向其他人征求类似建议:)
我将编写一个单元/集成测试,以验证匹配某些给定条件(即子类X)的任何类是否得到了适当的修饰。如果将生成设置为与测试一起运行,则此测试失败时,生成可能会失败
更新:你说,“看起来我只需要卷起袖子,确保单元测试得到集体维护”——你不必这么做。只需编写一个通用测试类,它使用反射查找所有需要断言的类。大概是这样的:
[TestClass]
当类型继承MyObject时的公共类
{
私有只读列表<;类型>;_类型=新列表<;类型>;();
当_type_继承_MyObject()时为公共
{
//让我们查找直接或间接从MyObject继承的所有类型
foreach(typeof(MyObject.Assembly.GetTypes()中的类型)
{
if(type.IsClass&;typeof(MyObject).IsAssignableFrom(type))
{
_类型。添加(类型);
}
}
}
[测试方法]
公共void属性\u具有\u XmlElement\u属性
{
foreach(类型为_类型)
{
foreach(类型.GetProperties()中的PropertyInfo属性)
{
object[]attribs=property.GetCustomAttributes(typeof(xmlementAttribute),false);
Assert.IsTrue(attribs.Count>;0,“在类型“+type.FullName”中的属性“+property.Name+”上缺少XmlElementAttribute);
}
}
}
}