使用锐化器为参数添加完成建议"nameof"



我想将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使用nameof使用InvokerParameterNameAttribute(来源: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);
        }
    }
}

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

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

我还在github上研究了一些仓库,只能以与我的尝试相同的方式找到解决方案。

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

是否可以在方法中添加参数的nameof建议?我该如何通过上述方法实现这一目标?

附加信息:我有VS2015 Resharper 2016.3.2。

实际上有效(但不按照您的意图)。当您键入,时,它不会立即建议您使用nameof表达式时,当您以字符串的形式完全键入参数名称而不是使用name of Expression。

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的反馈以实际实施您想要的行为。

另外,如果您键入"",光标将移至双引号中间,Resmarper建议可用参数的名称。

顺便说一句,您可以随时评论您的代码

/// <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);
    }
}

最新更新