我想将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'之后,我只会得到null
,new
的建议)。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);
}
}