当前位置:  开发笔记 > 编程语言 > 正文

实施类/方法的属性装饰

如何解决《实施类/方法的属性装饰》经验,为你挑选了1个好方法。

继我最近关于大型复杂对象作为Web服务结果的问题之后.我一直在考虑如何确保所有未来的子类都可以序列化为XML.

现在,显然我可以实现IXmlSerializable接口然后读取它的读者/写入器,但我想避免它,因为它意味着我需要在我想要的时候实例化读写器,并且99.99%的时间我将使用字符串,所以我可能只写自己的字符串.

但是,要序列化为XML,我只是用Xml来装饰类及其成员??? 属性(XmlRoot,XmlElement等),然后将其传递给XmlSerializerStringWriter以获取字符串.这一切都很好.我打算把方法返回到一个通用的实用工具方法,所以我不需要担心类型等.

我担心的是:如果我没有使用必需的属性装饰类,则在运行时才会抛出错误.

有没有办法强制执行属性修饰?可以用FxCop完成吗?(我还没用过FxCop)

更新:

很抱歉让这个关闭的人有很多关闭,很多事要做!

绝对喜欢在测试用例中使用反射来实现它的想法,而不是诉诸于FxCop(喜欢把所有东西放在一起).. Fredrik Kalseth的答案很棒,感谢包含代码,因为它可能会让我有点挖掘弄清楚自己该怎么做!

+1给其他人类似的建议:)



1> Fredrik Kals..:

我编写了一个单元/集成测试,用于验证任何符合某些给定条件的类(即子类化X)是否已正确修饰.如果将构建设置为使用测试运行,则可以在此测试失败时使构建失败.

更新:你说,"看起来我只需要卷起袖子,确保单元测试得到集体维护" - 你没必要.只需编写一个通用测试类,它使用反射来查找需要断言的所有类.像这样的东西:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List _types = new List();

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有