gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:56 26 4
gpt4 key购买 nike

有没有人知道一种方法可以防止开发人员在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com