`
Xorcerer
  • 浏览: 35275 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C#用反射实现类似单元测试中的自动调用测试方法。

    博客分类:
  • C#
阅读更多
在微软的单元测试中,每个测试方法,只要打上一个attribute(属性?不知道怎么翻译了)——TestMethod,就可以自动被调用。
最近公司需要针对某些类写一一对应的检测类,检测对应类的数据正确性。为了方便,我写了一个支持泛型的基类Checker<Type>,放置通用代码。
第一版的程序如下:
public class Checker<Type>
        where Type: HomeObject
    {
        public bool Check( Type hObject )
        {
            foreach ( MethodInfo method in this.GetType().GetMethods().Where(
                m =>
                    m.GetCustomAttributes( true ).Where(
                        attr => attr is CheckMethodAttribute
                        ).Count() > 0 ) )
            {

                if ( !(bool)method.Invoke( this, new object[] { hObject } ) ) return false;
            }
            return true;
        }
    }

这样每次运行Check函数,就可以自动调用带有CheckMethod的方法了。这些方法各自定义了一些独立的规则,格式都是boolean func(Type obj)。
请注意,上面提到一个CheckMethodAttribute,只需要一个空壳。
后缀Attribute不是必须的,我只是尊重微软的习惯。
    [AttributeUsage(AttributeTargets.Method)]
    public class CheckMethodAttribute: Attribute
    {
        public CheckMethodAttribute()
        {

        }
    }

子类例子如下,
    class JunctionBoxChecker: Checker<JunctionBox>
    {
        [CheckMethod]
        public bool IsInterior( JunctionBox junctionbox )
        {
            //Some Code......
            return surface.IsInterior;
        }

        [CheckMethod]
        public bool NotTooCloseWithOthers( JunctionBox junctionbox )
        {
            //Some Code......
            return boolValue;
        }
    }

这里有个小问题,那就是每次运行Check()时,都要搜索一次带有指定Attribute的方法,而其实所有的方法在编译之后,都是确定了的。
所以,更有效的写法是,其实可以在类中用一个静态的List来保存上面的方法的引用,该List在静态构造器中初始化和确定值。这里用到了C#的一个特性,Checker<ClassA>,Checker<ClassB>被当做两个类,所以,里面的静态List不冲突。
0
0
分享到:
评论

相关推荐

    动态调用DLL中的方法案例

    在.NET框架中,C#语言提供了强大的反射机制,使得程序在运行时能够动态地获取类型信息,甚至可以创建类型实例、调用方法、访问字段和属性。本案例将重点讲解如何利用反射功能来动态调用DLL(动态链接库)中的方法,...

    c# 反射 笔记本 增加功能

    7. 自动化UI测试:反射可以帮助编写自动化测试,通过检查控件的属性和调用方法来验证其行为。 8. 插件架构:在设计插件架构的应用中,反射可以用来查找并激活插件中的特定类型,从而实现对插件功能的动态加载和调用...

    Axis2完美教程java c#调用

    在后续的教程中,我们将深入探讨如何在Java和C#中实现这些调用,包括如何处理SOAP消息、异常处理以及如何优化性能。 总之,Apache Axis2提供了一种高效且灵活的方式来创建和调用Web服务,尤其适合初学者快速入门。...

    反射与依赖注入DEMO

    在依赖注入中,接口通常用来定义服务的契约,而具体的实现则可以通过依赖注入来替换,这样可以轻松地进行单元测试和系统扩展。 总结起来,"反射与依赖注入DEMO"可能演示了如何在Java程序中利用反射动态操作类和对象...

    C#调用Delphi编写的非托管Dll的例子源程序

    综上所述,要实现C#调用Delphi编写的非托管DLL,你需要创建一个C#项目,使用`[DllImport]`特性声明Delphi DLL中的函数,正确设置参数类型,并处理好封送问题。在代码中进行适当的异常处理,确保程序的健壮性。最后,...

    Think in C#

    15. **单元测试和持续集成**:C#支持各种单元测试框架(如NUnit、xUnit、MSTest等),有助于确保代码质量,并可与持续集成工具(如Jenkins、TeamCity)配合,构建自动化测试和部署流程。 阅读《Think in C#》这本书...

    C#深入详解pdf02

    8. **元数据与反射**:C#通过元数据提供了丰富的类型信息,反射则允许在运行时动态地获取和操作类型信息,如创建对象、调用方法等,这在插件系统和动态类型编程中非常有用。 9. **异常处理**:C#的异常处理机制基于...

    C语言实现的 json格式字符串与结构体自动相互转化

    在C语言中,由于没有内置的反射机制,实现类似功能通常需要手动编写代码来映射JSON键值到结构体成员。这可能包括解析JSON字符串,查找对应的结构体字段,然后将值赋给这些字段。 压缩包内的文件列表揭示了项目的...

    C++反射库--RTTR预编译包

    RTTR通过提供一种预编译的机制,使得C++开发者也能享受到类似于Java或C#等语言的反射功能,而无需破坏类的继承结构。 RTTR的工作原理主要基于元数据(metadata)和元对象(meta objects)。它允许你在编译时对类、...

    微软c#考题(面试题)

    8. **反射与动态编程**:反射允许在运行时检查和修改程序的行为,是实现诸如依赖注入、测试框架等功能的基础。 9. **垃圾回收机制**:C#的运行时环境管理内存,自动进行垃圾回收,避免了程序员手动管理内存带来的...

    C#编程思想

    以上只是《C#编程思想》一书中涉及的部分关键知识点,实际上,这本书还涵盖了更多高级主题,如反射、元数据、单元测试、设计模式等。对于想要学习C#编程的读者来说,这本书无疑是一本宝贵的参考资料。

    C#高级技巧2 高手总结出的

    以上只是C#高级技巧的一部分,实际的“C#高级技巧2 高手总结出的”可能包含更多深入话题,如错误处理、性能优化、并发控制、依赖注入、单元测试等方面的知识。学习并掌握这些技巧,将使你成为一名更高效的C#开发者。

    Unity面试题30题含答案——C#基础.

    - 给定代码示例中的初始化方式在C#中是错误的,正确的初始化方式应该是使用字符数组来构造字符串。例如,`string b = new string(new char[] { 'a', 'b', 'c' });` #### 7. 遍历集合时的错误处理 - 使用`foreach`...

    提高c#编程水平的50个要点

    18. **反射**:利用反射动态地获取类型信息和调用方法,增强程序的灵活性。 19. **序列化与反序列化**:了解XML、JSON和二进制序列化,以及如何使用DataContractSerializer或Json.NET。 20. **多线程与并发**:...

    C#面试题目

    `using`语句用于资源管理,如创建 disposable 对象并在完成后自动调用 Dispose 方法释放资源。`new`关键字用于实例化对象。 11. 代码输出分析: 当比较两个整数对象时,`Object.ReferenceEquals(i, j)`检查它们...

    候捷谈Java反射机制

    - **测试工具**:自动化测试工具通常会使用反射机制来动态创建对象和调用方法。 - **性能分析**:性能分析工具可能使用反射机制来获取类的内部信息,从而更好地分析程序的行为。 - **代码生成**:代码生成工具可能会...

    IronPython应用框架AuoPyTest(WinAPI/WatiN/SshScp/Dll插件反射等)

    (b) 自动化测试、自动任务均可以通过python脚本实现,工具集成解析器和调用执行,封装应用包括:linux ssh连接和scp,WinAPI、Web测试等。 (c) 可以不断扩展添加python或.net开源dll,在python脚本中调用。 (3)...

    IronPython应用框架AutoPyTest(WinAPI/WatiN/SshScp/Dll插件反射等)

    (b) 自动化测试、自动任务均可以通过python脚本实现,工具集成解析器和调用执行,封装应用包括:linux ssh连接和scp,WinAPI、Web测试等。 (c) 可以不断扩展添加python或.net开源dll,在python脚本中调用。 (3)...

Global site tag (gtag.js) - Google Analytics