在C#中,如何将某些方法调用完全保留在代码库之外?

nga*_*nju 13 c# methods

我试图摆脱所有的DateTime.Now方法调用,并用我自己的GetNow()方法替换它们,有时可能返回固定的日期用于测试目的.

我如何强制执行以后没有人添加DateTime.Now电话?我可以使用NDependStyleCop在我的持续集成服务器上进行检查吗?

Dan*_*mov 6

首先,DateTime.Now是一个财产.
这意味着您不需要在调用后放置括号.

其次,如果出于测试目的,您指的是像NUnit这样的框架,您可能需要查看Microsoft Moles,它允许您在测试时使用自己的自定义实现替换任何静态方法调用.哎呀,很酷:

[Test]
[ExpectedException (typeof (Y2KBugException))]
public void TestY2KBug ()
{
    MDateTime.NowGet = () => new DateTime (2001, 1, 1);
    Bomb.DetonateIfY2K ();
}


public static class Bomb {
    public static void DetonateIfY2K ()
    {
        if (DateTime.Now == new DateTime (2001, 1, 1))
            throw new Y2KBugException (); // take cover!
    }
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*eam 6

使用NDepend,编写此规则非常容易:

// <Name>Forbid DateTime.Now, use xxx.GetNow() instead</Name>
WARN IF Count > 0 IN 
SELECT METHODS WHERE 
IsDirectlyUsing "OPTIONAL:System.DateTime.get_Now()"
Run Code Online (Sandbox Code Playgroud)

注意:

  • WARN IF Count> 0 IN的前缀将CQL查询转换为规则
  • 通过字符串System.DateTime.get_Now()引用属性的方式
  • 前缀OPTIONAL表示"如果找不到属性get_Now,则不发出编译错误".这是有道理的,因为如果你的代码不再使用get_Now(),它就不再从NDepend分析中引用了.

另外,要生成原始查询...

SELECT METHODS WHERE 
IsDirectlyUsing "OPTIONAL:System.DateTime.get_Now()"
Run Code Online (Sandbox Code Playgroud)

...只需右键单击DateTime.get_Now()并选择直接使用我的Select方法....

在此输入图像描述