gpt4 book ai didi

c# - 如何在不将其写入 C# 中的字符串文字的情况下引用标识符?

转载 作者:太空狗 更新时间:2023-10-29 22:07:18 26 4
gpt4 key购买 nike

我经常想这样做:

public void Foo(Bar arg)
{
throw new ArgumentException("Argument is incompatible with " + name(Foo));
}

因为如果我更改 Foo 的名称,IDE 也会重构我的错误消息,如果我将方法名称(或任何其他类型的 member 标识符)放入其中,则不会发生什么字符串文字。我知道实现“名称”的唯一方法是使用反射,但我认为性能损失超过可维护性 yield ,并且它不会涵盖所有类型的标识符。

括号之间的表达式的值可以在编译时计算(如 typeof),并通过更改语言规范优化为一个字符串文字。您认为这是一项有值(value)的功能吗?

PS:第一个例子让问题看起来只与异常有关,但实际上并非如此。想一想您可能想要引用 type member 标识符的每种情况。您必须通过字符串文字来完成,对吧?

另一个例子:

[RuntimeAcessibleDocumentation(Description="The class " + name(Baz) +
" does its job. See method " + name(DoItsJob) + " for more info.")]
public class Baz
{
[RuntimeAcessibleDocumentation(Description="This method will just pretend " +
"doing its job if the argument " + name(DoItsJob.Arguments.justPretend) +
" is true.")]
public void DoItsJob(bool justPretend)
{
if (justPretend)
Logger.log(name(justPretend) + "was true. Nothing done.");
}
}

更新:这个问题是在 C# 6 之前发布的,但对于使用该语言早期版本的人来说可能仍然相关。如果您使用的是 C# 6,请查看 nameof 运算符,它的作用与上述示例中的 name 运算符几乎相同。

最佳答案

好吧,你可以作弊并使用类似的东西:

public static string CallerName([CallerMemberName]string callerName = null)
{
return callerName;
}

和:

public void Foo(Bar arg)
{
throw new ArgumentException("Argument is incompatible with " + CallerName());
}

在这里,所有工作都由编译器完成(在编译时),因此如果您重命名该方法,它将立即返回正确的内容。

关于c# - 如何在不将其写入 C# 中的字符串文字的情况下引用标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18119857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com