![](/img/trans.png)
[英]Should I provide a method with a member name with nameof, or should I depend on CallerMemberName to do it for me?
[英]{CallerMemberName} like Functionality for nameof() param
我正在编写更多的库代码,但遇到了麻烦-这是一个示例
public static TParam RequiredParam<TParam>(TParam param, string name) where TParam : class
{
return param ?? throw new ArgumentNullException(name);
}
private readonly int _testInt;
public TestClass(int testInt)
{
_testInt = RequiredParam(testInt, nameof(testInt));
}
基本上我必须在用法中输入名称
我想拥有的是:
public static TParam RequiredParam<TParam>(TParam param) where TParam : class
{
return param ?? throw new ArgumentNullException(*NAME STILL GETS HERE SOMEHOW*);
}
private readonly int _testInt;
public TestClass(int testInt)
{
_testInt = RequiredParam(testInt);
}
有没有更好的办法? 在WPF时代,我曾经像这样使用[CallerMemberName]:
private void PropertyChanged([CallerMemberName]string name = default)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
有人知道类似的东西可以达到相同的结果吗? 考虑到该库的调用频率,我不介意进入构建后步骤或其他任何步骤,但是出于性能原因,宁愿避免反射。
编辑-使目标更清晰
首先,我个人还是不会这样做,您将逻辑隐藏在另一种方法中以节省几次击键。 在此过程中,对于新读者,他们将不得不单击以查看其功能,并且无论如何,您仍然必须使用nameof
。
您可能可以通过反射来做一些事情,但是即使如此,要获得可疑的收益也将是很多工作。
我可以建议第三种方法吗?
为什么不为关键字args
创建一个Resharper模板[tab]
$NAME$ = $NAME$ ?? throw new ArgumentNullException(nameof($NAME$));
好处是
另外,如果您使用Resharper,请签出代码注释属性
我猜你也可以使用一个表达式
例
public void ExampleFunction(Expression<Func<string, string>> f) {
Console.WriteLine((f.Body as MemberExpression).Member.Name);
}
用法
ExampleFunction(x => WhatIsMyName);
依我之见,什么都没有得到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.