Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# nameof()参数的{CallerMemberName}类功能_C#_.net_Attributes_Method Signature - Fatal编程技术网

C# nameof()参数的{CallerMemberName}类功能

C# nameof()参数的{CallerMemberName}类功能,c#,.net,attributes,method-signature,C#,.net,Attributes,Method Signature,我正在编写更多的库代码,遇到了一个麻烦-下面是一个例子 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)

我正在编写更多的库代码,遇到了一个麻烦-下面是一个例子

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));
}
有没有人知道类似的方法可以达到同样的效果?考虑到这个库被调用的频率,我不介意进入构建后的步骤,但出于性能原因,我更愿意避免反射


编辑-使我的目标更清晰

首先,我个人无论如何都不会这么做,你在另一种方法后面隐藏了逻辑,以保存几个击键。在这样做的过程中,对于新读者,他们将不得不点击查看它的功能,而您仍然必须使用nameof

你也许可以用反射来做一些事情,但即使这样,也会有很多工作要做

我能推荐第三种方法吗

为什么不为关键字args[tab]创建一个重竖琴模板呢

好处是

新读者可以很容易地看到发生了什么。 您只有最少的按键笔划,因为它会在几个字母后提示类型 您可以节省一点IL和对堆栈的调用 如果您使用Resharper,请查看

我想你也可以用一个表达

范例


但在我看来,没有什么真正的收获

老实说,我没有完全实现您想要实现的目标。这意味着您将有一种不同的方法来检查引用类型和值类型。我认为出于可读性原因,您应该使用相同的命令。@SeM-我想将调用从-RequiredParamtestInt,nameoftestInt;-to-要求的参数测试;但仍将变量的名称记录在exception@Xsjado如果你能做到这一点,我们一开始就不必使用nameof,哪一个注意事项只是CYou后来的一个补充,你可以-很好地-使用表达式RequiredParam=>testInt-read不会像这样使用Resharper强迫任何使用我的库的人也使用Resharper?@Xsjado在第二种情况下是的
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);
}
private void PropertyChanged([CallerMemberName]string name = default)
{
  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
$NAME$ = $NAME$ ?? throw new ArgumentNullException(nameof($NAME$));
public void ExampleFunction(Expression<Func<string, string>> f) {
    Console.WriteLine((f.Body as MemberExpression).Member.Name);
}
ExampleFunction(x => WhatIsMyName);