我有这个 C# 函数:
public void MyFunction(string propertyName)
{
....
}
该函数将属性名称存储在数据库中以供进一步使用。
我想阻止此方法的用户nameof(MyProperty)
用作参数,以防止用户在更高版本中重命名属性时可能发生的情况。
是否可以指定一个不允许nameof
作为参数调用的方法?
你需要自己写,DiagnosticAnalyzer
订阅SyntaxKind.InvocationExpression
。context.RegisterSyntaxNodeAction
然后检查被调用的方法是否是有问题的方法,然后查看是否有任何参数是nameof
调用。所以示意图如下:
context.RegisterSyntaxNodeAction(
c =>
{
var invocation = (InvocationExpressionSyntax)c.Node;
var symbol = c.SemanticModel.GetSymbolInfo(invocation.Expression).Symbol as IMethodSymbol;
if (!IsMyMethod(symbol))
{
return;
}
if (invocation.ArgumentList != null &&
invocation.ArgumentList.Arguments
.Select(a => a.Expression)
.OfType<InvocationExpressionSyntax>()
.Any(i => i.Expression.ToString() == "nameof"))
{
c.ReportDiagnostic(...);
}
},
SyntaxKind.InvocationExpression);