我有这个C#功能:
public void MyFunction(string propertyName)
{
....
}
该函数将属性名称存储在数据库中以供进一步使用。
我想阻止此方法的用户使用nameof(MyProperty)
作为参数,以防止用户在以后的版本中重命名该属性时可能发生的情况。
是否可以在方法上指定不允许使用nameof
作为参数进行调用?
答案 0 :(得分:3)
您需要自己编写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);