强制执行的属性装修的课程/方法
-
09-06-2019 - |
题
在我最近的问题上 大型、复杂的物体作为一个网络服务的结果.我一直在想我怎么可以确保所有未来的儿童的课程序列化以XML。
现在,很明显我可以实现的 IXmlSerializable 接口,然后夹读者/作家但我希望避免的,因为它然后意味着,我需要一个实例读者/作家每当我想要做到这一点,并99.99%的时间我将要工作 字符串 所以我可能只是写我自己。
然而,序列化的XML,我只是装饰类及其成员与 Xml??? 属性( XmlRoot , XmlElement 等等)。 然后传递到的 序列化程序 和一个 StringWriter 获得串。这是都好。我打算投入的方法返回串成一个通用的实用方法,所以我不需要担心的类型等。
这问题我是这样的:如果我不要装饰类(es)所需属性的一个错误是不是扔到运行时间。
是否有任何方式强制执行属装饰?这样做可以与FxCop? (我没有用FxCop尚未)
更新:
抱歉耽搁在得到这个关闭了伙计们,许多事情要做!
肯定喜欢这个主意使用反映做一个测试案例,而不是诉诸FxCop(喜欢把一切都在一起).. 弗雷德里克*Kalseth的答案 太棒了,谢谢包括代码,因为它可能会带我一点挖掘怎样做我自己!
+1其他人对于类似的建议)
解决方案
我会写一个单位/合测试,检验任何类配对一些特定的标准(即继承X)是装饰。如果你设置建立运行测试,可以有建立失败时,该测试失败。
更新:你说,"看来我只需要我的袖子卷起来,并确保该单元的测试统保持"-你不必。只是写一个一般性测试类使用的反射找到的所有类需要赔。事情是这样的:
[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);
}
}
}
}
其他提示
你可以写单元的测试,以检查这种事-这基本上采用的反思。
鉴于这是可能的,我猜它还将有可能编写一FxCop规则,但是我从来没有做过这样的事情。
你可以写一FxCop规则或甚至检查的属性,通过调GetType()在基类的构造,反映了返回的类型。
一个很好的FXCop规则(和一个我发现我现在需要的)将来检查的所有对象都正在加入的ASP.NET 会议有序列化的属性。我试图从InProc届会议的国家到SQL服务器。我第一次请一个页面上,我站点引爆了我因为非序列化的对象被保存在会议。后来的任务的狩猎通过的所有源代码寻找每一个实例,其中一个目的是设置在该届会议的...FXCop将是一个很好的解决方案。一些工作。
你也可以使用这个概念/后处理强制执行之间的关系属性和使用类似于登录以强制执行之间的关系的类别和特性,在编制时间:
http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92