I\'m trying to get rid of all DateTime.Now
method calls and replace them with my own GetNow()
method, which may sometimes return a fixed date for t
You could use Moles in your tests to provide your own DateTime.Now when required, without the need to modify any existing code that calls it.
Another option might be to modify the assembly after compilation to call something else. (Perhaps, use Mono.Cecil to rewrite the IL, and add a command to the post-build in VS to run it.)
You could perhaps grab the Mono source and build yourself a custom mscorlib with the function removed.
There's no real way to enforce something like this.
The closest you're going to come is making a custom FxCop rule or custom Visual Studio Code Analysis rule to error/warn on calls to DateTime.Now.
Firstly, DateTime.Now is a property.
That means you don't need to put parenthesis after call.
Secondly, if by testing purposes you mean a framework like NUnit, you might want to check out Microsoft Moles which allows you to substitute any static method call with your own custom implementation while testing. Heck, it's cool:
[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!
}
}
I don't think that this is possible. What you are actually trying to do is override DateTime's struct functionality.
The only way I can think of is just to go with a custom class that will wrap common functionality of DateTime and offer different functionality on demand...
With NDepend it is very easy to write this rule:
// <Name>Forbid DateTime.Now, use xxx.GetNow() instead</Name>
WARN IF Count > 0 IN
SELECT METHODS WHERE
IsDirectlyUsing "OPTIONAL:System.DateTime.get_Now()"
Notice:
Also, to generate the original query...
SELECT METHODS WHERE
IsDirectlyUsing "OPTIONAL:System.DateTime.get_Now()"
...just right-click DateTime.get_Now() and choose Select methods ... that are directly using me
One approach might be to add a pre-commit hook to your source control repository of choice to look for DateTime.Now
and abort the check-in if you find the offending string. It's not foolproof and it might be annoying to your colleagues but it should help keep it out of the codebase.