【问题标题】:Add completion suggestion 'nameof' for parameter with Resharper使用 Resharper 为参数添加完成建议“nameof”
【发布时间】:2017-03-11 03:00:19
【问题描述】:

我想在方法的参数中添加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, &lt;...&gt;) 时,我希望得到nameof(testString)&lt;...&gt; 的建议。上面的方法不建议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 上查看了一些 repo,但只能以与我尝试相同的方式找到解决方案。

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

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

其他信息: 我有 VS2015 + Resharper 2016.3.2。

【问题讨论】:

    标签: c# .net attributes resharper


    【解决方案1】:

    实际上可行(但不是您想要的)。它不会在您输入 , 时立即建议...它只会建议您在完全以字符串形式输入参数名称而不是使用 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.
    }
    

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

    此外,如果您键入 "",光标将移动到双引号中间,并且 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);
        }
    }
    

    【讨论】:

    • Resharper 在我编写方法调用后确实建议使用nameof,但我希望在输入时看到nameofsuggestion。如写throw new ArgumentNullException(时,直接提示nameof(value)。在我的方法中这甚至可能吗?至于这个方法的文档,我把它从帖子中排除了,但在帖子中更新了它。
    • @FirstOrGoat 据我所知,您想要的行为无法实现。您可以建议并提交有关此行为的反馈,他们可能会对此进行处理或为您提供解决方案
    • 谢谢!我会在 Resharper 上提出这个建议,并在收到他们的反馈时更新我的​​帖子。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2019-11-06
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多