继我最近关于 Large, Complex Objects as a Web Service Result 的问题之后.我一直在思考如何确保所有 future 的子类都可序列化为 XML。
现在,显然我可以实现 IXmlSerializable接口(interface),然后将读取器/写入器插入其中,但我想避免这种情况,因为这意味着我需要在任何时候想要实例化读取器/写入器,并且 99.99% 的时间我将使用string 所以我可能只写我自己的。
但是,为了序列化为 XML,我只是用 Xml??? 属性(XmlRoot、XmlElement 等),然后将其传递给 XmlSerializer 和 StringWriter 以获取字符串。这一切都很好。我打算将返回字符串的方法放入通用实用程序方法中,这样我就不需要担心类型等问题。
让我担心的是:如果我不使用所需的属性装饰类,则直到运行时才会抛出错误。
有什么方法可以强制进行属性修饰吗?这可以用 FxCop 完成吗?(我还没有用过 FxCop)
更新:
很抱歉让这个亲密的人延迟,还有很多事情要做!
绝对喜欢在测试用例中使用反射而不是求助于 FxCop(喜欢将所有内容放在一起)的想法。Fredrik Kalseth's answer太棒了,感谢您提供代码,因为我可能需要花一些时间才能自己弄清楚如何做到这一点!
+1 给其他人以获得类似的建议 :)
最佳答案
我会编写一个单元/集成测试来验证任何符合某些给定标准(即子类化 X)的类是否得到了适当的修饰。如果您将build设置为与测试一起运行,则可以在该测试失败时让构建失败。
更新:您说,“看来我只需要卷起袖子确保单元测试得到共同维护”——您不必这样做。只需编写一个通用测试类,使用反射来查找所有需要断言的类。像这样:
[TestClass]
public class When_type_inherits_MyObject
{
private readonly List<Type> _types = new List<Type>();
public When_type_inherits_MyObject()
{
// lets find all types that inherit from MyObject, directly or indirectly
foreach(Type type in typeof(MyObject).Assembly.GetTypes())
{
if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
{
_types.Add(type);
}
}
}
[TestMethod]
public void Properties_have_XmlElement_attribute
{
foreach(Type type in _types)
{
foreach(PropertyInfo property in type.GetProperties())
{
object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
}
}
}
}
关于c# - 强制类/方法的属性装饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454/