假设我有类型
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."
或"Cannot use A like that."
。
答案 0 :(得分:9)
如果您不关心显示T
,您可以使用例如nameof(A<object>)
,假设object
符合泛型类型约束。
这导致&#34;不能像那样使用A.&#34;
如果您想要准确打印A<T>
,可以使用:
$"{nameof(A<T>)}<{nameof(T)}>"
但仅限于班级内,因为T
在其他地方不存在。
答案 1 :(得分:3)
根据您要引发该异常的位置,您可以使用类型。
在实例上,请致电this.GetType()
,然后获取Name
或FullName
媒体资源:
throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
答案 2 :(得分:2)
你试过了吗?
typeof(T).FullName;
或
t.GetType().FullName;
希望它适合你。