gpt4 book ai didi

c# - 使来自第三方库的扩展方法过时

转载 作者:太空狗 更新时间:2023-10-29 22:35:55 24 4
gpt4 key购买 nike

这个问题不是关于我可以用 [System.Obsolete] 标记的方法。我想忽略的方法在我无法控制的 dll 中。

我使用包含对象扩展方法的第 3 方库。这会导致困惑,并可能在将来引起问题。有什么方法可以在外部将此扩展方法(或来自某个 dll 的所有扩展方法)标记为过时或防止此扩展方法出现在智能感知中。有问题的方法是:

    public static class ExtensionMethods
{
public static bool IsNumeric(this object obj)
{
if (obj == null)
return false;
return obj.GetType().IsPrimitive || obj is double || (obj is Decimal || obj is DateTime) || obj is TimeSpan;
}
}

最佳答案

您可以使用 Roslyn 代码分析器执行此操作。以下代码将创建一个 DiagnosticAnalyzer,如果使用 String.EndsWith(),它会发出编译器警告。

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class ForbiddenMethodsAnalyzer : DiagnosticAnalyzer
{
private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor("Forbidden",
"Don't use this method!",
"Use of the '{0}' method is not allowed",
"Forbidden.Stuff",
DiagnosticSeverity.Warning,
isEnabledByDefault: true,
description: "This method is forbidden");
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }

public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
}

private static void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
{
var invocationExpression = (InvocationExpressionSyntax)context.Node;
var memberAccessExpression = invocationExpression.Expression as MemberAccessExpressionSyntax;
if (memberAccessExpression?.Name.ToString() == "EndsWith")
{
var memberSymbol = context.SemanticModel.GetSymbolInfo(memberAccessExpression).Symbol as IMethodSymbol;
var containingType = memberSymbol.ContainingType;
if (containingType.ContainingNamespace.Name == "System" && containingType.Name == "String")
{
var diagnostic = Diagnostic.Create(Rule, invocationExpression.GetLocation(), memberAccessExpression.ToString());
context.ReportDiagnostic(diagnostic);
}
}
}
}

Tooltip warning Error List warning

有 3 个选项可以像这样使用分析器:

  • DiagnosticAnalyzer 代码直接添加到您的项目中。它将仅适用于该解决方案。
  • 创建一个包含 DiagnosticAnalyzer 的类库,并分发它作为 Nuget 包。它将仅适用于使用该包的解决方案。
  • 编译一个完整的 VSIX 扩展,包含类(class)。该分析器适用于您加载的任何解决方案。

这是我完成的第一个使用 Roslyn 代码分析功能的项目,因此很遗憾,我并不了解这里发生的一切。我从默认的 Analyzer 模板开始,尝试了各种方法,逐步执行代码,并使用监 window 口查看变量,直到找到实现此功能所需的信息。

基本过程是注册一个 SyntaxNode 分析函数,过滤为调用方法的表达式。在该方法中,我检查正在检查的 MemberAccessExpressionSyntaxName 是否为“EndsWith”。如果是,我获取该方法所在的 ContainingType,并检查它是否在 System 命名空间中的 String 类上.如果是,我从 DiagnosticDescriptor 创建一个 Diagnostic 实例来告诉 IDE 问题出在哪里,以及它代表了多少问题(在这种情况下是警告,如果我愿意,我可以把它变成一个完整的错误,这会阻止代码编译)。也可以向用户提供不同的选项来自动修复错误,但我还没有探索过。

很多信息来自this tutorial ,以及大量的试验和错误。

关于c# - 使来自第三方库的扩展方法过时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45508556/

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