如果使用了C#表达式(或抛出错误),则警告Visual Studio中的开发人员
有人知道有什么方法可以防止开发人员在Visual Studio 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
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”放在接口后面,这样您就可以轻松地注入时间提供者