43

假设我有类型

public class A<T> { }

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

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

到目前为止,一切都很好,但我不想硬编码类名,所以我想我可以使用

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.");

但那些产量

类型参数的数量不正确。

缺少类型参数。


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

理想情况下,我想要实现的是"Cannot use A<T> like that."or "Cannot use A like that."

4

3 回答 3

32

你有没有尝试过:

typeof(T).FullName;

或者

t.GetType().FullName;

希望对你有效。

于 2018-04-18T11:08:04.997 回答
30

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

这导致“不能像那样使用 A”。

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

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

但仅限于班级内部,T其他地方不存在。

于 2018-04-18T11:04:44.913 回答
11

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

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

throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
于 2018-04-18T11:07:18.820 回答