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

标签 c# visual-studio stylecop

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

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

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

我这样做的原因是为了防止任何非 UTC 时间值进入数据库。高级开发人员在这方面很扎实,但是我一次又一次地看到 DateTime.Now 被不太高级的开发人员使用,我想自动化管理它。

我知道将服务器时区设置为 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);
        }
    }
}

这只是为了让您了解如何使用 Roslyn ,一个 C# 编译器工具。在这里,我使用它将字符串转换为 C# Abstract Syntax Tree , 直接修改 AST,然后 toString AST。

操作 AST 的最大优势是通过 regex 直接操作文本,就是安全。 (不可否认,在这个例子中不太重要)。

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

或者,您可以制作一个主动代码分析器,一种智能感知。 (无论如何,Roslyn 可能更适合这一点。)

祝你好运!

关于c# - 如果使用 C# 表达式(或抛出错误),则在 Visual Studio 中警告开发人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829965/

相关文章:

winforms - 在用户控件中使用构造函数注入(inject)的方法?

xml - Visual Studio 中是否有键盘快捷键可以跳转到 XML 代码 View 中的父 XML/XHTML 节点?

c# - "using <namespace>;"指令能否在 .NET 中变得更高效?

c# - 如何显示解决方案的所有 StyleCop 警告?

StyleCop 拼写破坏 TeamCity

c# - 使用注释和 IValidatableObject 进行递归验证

c# - ActionFilterAttribute 重定向到带参数的操作方法

c# - Linq 查询无法执行方法

c# - 取消异步操作

visual-studio - 在 Visual Studio 中更改解决方案资源管理器的背景颜色