C#nameof泛型类型,不指定类型

Tho*_*kow 11 c# generics nameof

假设我有类型

public class A<T> { }
Run Code Online (Sandbox Code Playgroud)

在代码中的某个地方,我想抛出与该类型的错误使用相关的异常:

throw new InvalidOperationException("Cannot use A<T> like that.");
Run Code Online (Sandbox Code Playgroud)

到目前为止,这么好,但我不想硬编码类名,所以我想我也许可以使用

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

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

throw new InvalidOperationException($"Cannot use {nameof(A)} like that.");
Run Code Online (Sandbox Code Playgroud)

要么

throw new InvalidOperationException($"Cannot use {nameof(A<>)} like that.");
Run Code Online (Sandbox Code Playgroud)

但那些产量

类型参数数量不正确.

缺少类型参数.


我绝对不想硬编码类名,因为它可能会在以后更改.我怎样才能得到班级的名字,最好是通过nameof

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

Pac*_*eco 26

你有没有尝试过:

typeof(T).FullName;
Run Code Online (Sandbox Code Playgroud)

或者

t.GetType().FullName;
Run Code Online (Sandbox Code Playgroud)

希望对你有效。


Rot*_*tem 11

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

这导致"不能使用A那样的".

如果您想要完全打印A<T>,可以使用:

$"{nameof(A<T>)}<{nameof(T)}>"
Run Code Online (Sandbox Code Playgroud)

但是只有在课堂上才有,T而其他地方则不存在.

  • 这将给你'A <T>`,而不是'A <sometype>` (4认同)
  • @quetzalcoatl:`nameof`只接受规范所称的"简单名称".然后,它不仅仅用了一页来指定什么是简单的,但底线,开放式泛型不是简单的名称.它所谓的"未绑定的泛型类型"仅在某些上下文中被允许,并且被特别处理. (3认同)
  • @quetzalcoatl但事实并非如此. (2认同)

Pat*_*man 6

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

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

throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
Run Code Online (Sandbox Code Playgroud)

  • 您可以这样做,但是大多数人并不觉得A \`1(类的真实内部名称)可读性强。 (2认同)