Запретить использование nameof в качестве параметра метода

У меня есть эта функция C#:

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

Функция сохраняет имя свойства в базе данных для дальнейшего использования.

Я хочу, чтобы пользователи этого метода не использовали nameof(MyProperty) в качестве параметра, чтобы предотвратить ситуации, которые могут возникнуть, если пользователь переименует свойство в более поздней версии.

Можно ли указать метод, который нельзя вызывать с nameof в качестве параметра?

1 ответ

Вам нужно будет написать свой собственный 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);
Другие вопросы по тегам