0

我有这个 C# 函数:

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

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

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

是否可以指定一个不允许nameof作为参数调用的方法?

4

1 回答 1

3

你需要自己写,DiagnosticAnalyzer订阅SyntaxKind.InvocationExpressioncontext.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);
于 2016-06-23T14:49:27.693 回答