c# - 强制类/方法的属性装饰

标签 c# xml serialization coding-style .net-attributes

继我最近关于 Large, Complex Objects as a Web Service Result 的问题之后.我一直在思考如何确保所有 future 的子类都可序列化为 XML。

现在,显然我可以实现 IXmlSerializable接口(interface),然后将读取器/写入器插入其中,但我想避免这种情况,因为这意味着我需要在任何时候想要实例化读取器/写入器,并且 99.99% 的时间我将使用string 所以我可能只写我自己的。

但是,为了序列化为 XML,我只是用 Xml??? 属性(XmlRootXmlElement 等),然后将其传递给 XmlSerializerStringWriter 以获取字符串。这一切都很好。我打算将返回字符串的方法放入通用实用程序方法中,这样我就不需要担心类型等问题。

让我担心的是:如果我不使用所需的属性装饰类,则直到运行时才会抛出错误。

有什么方法可以强制进行属性修饰吗?这可以用 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/

相关文章:

c# - Func<T, TResult> 用于无效 TResult?

c# - 如何返回 IDictionary C# 的所有 KeyValuePairs

c# - 如何使用反射返回从泛型子类化的所有类,而不给出特定的泛型类型

xml - 如何使用 XSLT 1 对 XML 元素中的值进行计数

xml - 带有命名空间的 XPath 选择节点

java - GWT 序列化和装饰器模式

java - Gradle - 使用 jaxb 生成可序列化的类

C# OutOfMemoryException - 如何追踪罪魁祸首

java - XMLStreamWriter.writeStartElement(前缀,本地名称,命名空间URI): no binding of prefix to namespace

c# - 为什么附加调试器后即时编译的 C# 代码无法运行?