如果使用了C#表达式(或抛出错误),则警告Visual Studio中的开发人员

如果使用了C#表达式(或抛出错误),则警告Visual Studio中的开发人员,c#,visual-studio,stylecop,C#,Visual Studio,Stylecop,有人知道有什么方法可以防止开发人员在Visual Studio C#代码库中使用特定类型的表达式吗?我已经看到分析仪可能是解决这个问题的方法 我希望Visual Studio在开发人员使用我们的代码库中的DateTime.Now而不是DateTime.UtcNow时警告他们 就我的分析而言,我认为我们永远不需要使用DateTime。现在在我们的API代码库中使用,所以我也在考虑如果DateTime,在编译时抛出错误的想法。现在使用了,以防单元测试不包括这种情况 我这样做的原因是为了防止任何非UT

有人知道有什么方法可以防止开发人员在Visual Studio C#代码库中使用特定类型的表达式吗?我已经看到分析仪可能是解决这个问题的方法

我希望Visual Studio在开发人员使用我们的代码库中的
DateTime.Now
而不是
DateTime.UtcNow
时警告他们

就我的分析而言,我认为我们永远不需要使用
DateTime。现在在我们的API代码库中使用
,所以我也在考虑如果
DateTime,在编译时抛出错误的想法。现在使用了
,以防单元测试不包括这种情况

我这样做的原因是为了防止任何非UTC时间值进入数据库。高级开发人员对这一点非常了解,但是我已经一次又一次地看到
DateTime。现在
正被较低级别的开发人员使用,我想自动管理这一点

我知道,将服务器时区设置为UTC可能会否定这一点,但我希望更接近原因来解决这个问题

有没有人知道我可以利用的现有工具,或者我应该编写自己的分析器


任何提示都将不胜感激。

这里有一个简单的Rosalyn示例:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; //NuGet package
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;

namespace StackOverflow_RosalynExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var tree = CSharpSyntaxTree.ParseText(@"
using System;

namespace SomeNamespace
{
    class SomeClass
    {
        public void SomeMethod()
        {
            DateTime example = DateTime.Now;
        }
    }
}");

            var rewriter = new DateTimeUtcEnsurer();
            var result = rewriter.Visit(tree.GetRoot());
            Console.WriteLine(result.ToFullString());
            Console.ReadKey(); //DateTime.Now -> DateTime.UtcNow
        }
    }

    public class DateTimeUtcEnsurer : CSharpSyntaxRewriter
    {
        public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            var dateTimeNow = SyntaxFactory.ParseExpression("DateTime.Now") as MemberAccessExpressionSyntax;
            if (SyntaxFactory.AreEquivalent(node, dateTimeNow))
            {
                var dateTimeUtcNow = SyntaxFactory.ParseExpression("DateTime.UtcNow") as MemberAccessExpressionSyntax;
                dateTimeUtcNow = dateTimeUtcNow.WithTrailingTrivia(SyntaxFactory.ParseTrailingTrivia(" /*Silly junior dev ;)*/"));
                return dateTimeUtcNow;
            }
            return base.VisitMemberAccessExpression(node);
        }
    }
}
这只是让您了解如何使用C#编译器工具。在这里,我使用它将字符串转换为C#,直接修改AST,然后转换AST

操作AST的最大优点是安全性,比如说通过直接操作文本。(无可否认,在本例中不太重要)

根据您的需要,您可以调整此示例以接受文件目录作为命令行参数,并针对以cs结尾的所有文件运行重写器。(我去年也做了类似的事情;~20秒内处理了10000个文件)。然后,您可以在每次签入源代码管理之前运行强制工具

或者,您可以制作一个活动代码分析器,即la intellisense。(无论如何,罗斯林可能更适合于这一点。)


祝你好运

在代码库中搜索字符串“DateTime.Now”的预生成操作,如果找到,则会失败?您可能希望在
StyleCop Analyzers中使用squiz。这方面没有现成的东西,但它可能会给你一些自己写的技巧。我还想说,永远不要使用DateTime,而是DateTimeOffset。。。。此外,我还将get“Now”放在接口后面,这样您就可以轻松地注入时间提供者