拒绝使用nameof作为方法的参数

时间:2016-06-23 06:57:57

标签: c# .net roslyn c#-6.0 nameof

我有这个C#功能:

public void MyFunction(string propertyName)
{
    ....
}

该函数将属性名称存储在数据库中以供进一步使用。

我想阻止此方法的用户使用nameof(MyProperty)作为参数,以防止用户在以后的版本中重命名该属性时可能发生的情况。

是否可以在方法上指定不允许使用nameof作为参数进行调用?

1 个答案:

答案 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);