使用 Resharper 为参数添加补全建议 'nameof'

Add completion suggestion 'nameof' for parameter with Resharper

我想在方法中的参数中添加 nameof 的完成建议。

方法:

public static class Ensure
{
    /// <summary>
    /// throws <see cref="ArgumentException"/> exception if string is null or empty.
    /// </summary>
    /// <param name="value">string to check its content.</param>
    /// <param name="name">name of parameter passed.</param>
    public static void StringNotNullOrEmpty(string value, string name)
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException("Value cannot be null or empty", name);
        }
    }
}

输入 Ensure.StringNotNullOrEmpty(testString, <...>) 时,我想获得 <...>nameof(testString) 建议。上面的方法不建议 nameof(更糟糕的是,在输入 'n' 后我只得到 nullnew 的建议)。 nameof(...) 是必需的,所以我在 ArgumentException 中得到正确的 ParamName

在 Resharper 的网站上,它说 ArgumentNullException 通过使用 InvokerParameterNameAttribute 来利用 nameof 建议(来源:Resharper InvokerParameterNameAttribute)。

尝试: 所以我在我的项目中安装了 nuget 包:JetBrains.Annotations 10.4.0 并更改了如下方法:

public static class Ensure
{
    /// <summary>
    /// throws <see cref="ArgumentException"/> exception if string is null or empty.
    /// </summary>
    /// <param name="value">string to check its content.</param>
    /// <param name="name">name of parameter passed.</param>
    public static void StringNotNullOrEmpty([CanBeNull] string value, 
        [NotNull] [InvokerParameterName] string name)
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException("Value cannot be null or empty", name);
        }
    }
}

不幸的是,当我输入 Ensure.StringIsNotNullOrEmpty(testString, 时,上述尝试仍然没有给我 nameof 的建议。

我发现的其他一些东西是 MSDN 上的 CallerMemberNameAttribute。但这只给我调用方法的名称 string

我也在 GitHub 上查看了一些回购协议,只能找到与我尝试相同的解决方案。

我能想到的一个原因是,当在一个方法中有两个 string 参数并在后者上定义了 InvokerParameterNameAttribute 时,这可能会让 Resharper 感到困惑。

是否可以为方法中的参数添加 nameof 建议?我怎样才能用上述方法实现这一目标?

附加信息: 我有 VS2015 + Resharper 2016.3.2。

实际上可行(但不是您想要的那样)。它不会在您键入 , 时立即建议...当您以字符串形式完全键入参数名称而不是使用 nameof 表达式时,它只会建议您使用 nameof 表达式。

static void Caller(string arg)
{
    StringNotNullOrEmpty(arg, "arg"); // only now resharper suggests to use nameof.
    StringNotNullOrEmpty(arg, "something else"); // now resharper complains about unknown argument name.
}

您可以 submit feedback 在 resharper 上实际实现您想要的行为。

此外,如果您键入 "",光标将移动到双引号的中间,并且 resharper 会建议可用参数的名称。

顺便说一句,您可以随时评论您的代码,这对未来的每一位读者都有用

/// <summary>
/// throws <see cref="ArgumentException"/> exception if string is null or empty.
/// </summary>
/// <param name="value">string to check its content.</param>
/// <param name="name">name of parameter passed.</param>
public static void StringNotNullOrEmpty([CanBeNull] string value,
    [NotNull] [InvokerParameterName] string name)
{
    if (string.IsNullOrEmpty(value))
    {
        throw new ArgumentException("Value cannot be null or empty", name);
    }
}