繁体   English   中英

{CallerMemberName}类似于nameof()参数的功能

[英]{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$));

好处是

  • 新读者可以轻松查看最新情况。
  • 您只有很少的击键,因为它会在几个字母后提示您键入
  • 您保存一点IL和对堆栈的调用

另外,如果您使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM