没有指定类型的 C# nameof 泛型类型

C# nameof generic type without specifying type

假设我有类型

public class A<T> { }

在代码的某处我想抛出与该类型的不正确使用相关的异常:

throw new InvalidOperationException("Cannot use A<T> like that.");

到目前为止一切顺利,但我不想硬编码 classes 名称,所以我想我可以使用

throw new InvalidOperationException($"Cannot use {nameof(A<T>)} like that.");

相反,但在这种情况下我不知道确切的类型 T。 所以我想也许我可以像在 C++ 中那样使用模板专业化来做到这一点:

throw new InvalidOperationException($"Cannot use {nameof(A)} like that.");

throw new InvalidOperationException($"Cannot use {nameof(A<>)} like that.");

但那些产量

Incorrect number of type parameters.

Type argument is missing.


我绝对不想对 classes 名称进行硬编码,因为它以后可能会更改。如何获得 class 的名称,最好通过 nameof?

最理想的是,我想要达到的是"Cannot use A<T> like that.""Cannot use A like that."

如果您不关心显示 T,您可以使用例如nameof(A<object>),假设 object 符合通用类型约束。

这导致 "Cannot use A like that."

如果你想精确打印 A<T>,你可以使用:

$"{nameof(A<T>)}<{nameof(T)}>"

但仅来自 class,因为 T 在其他地方不存在。

根据您想引发异常的位置,您可以使用类型。

在实例上,调用 this.GetType() 然后获取 NameFullName 属性:

throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");

你试过了吗:

typeof(T).FullName;

t.GetType().FullName;

希望对你有用。