假设我有类型
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."
。
你试过吗:
typeof(T).FullName;
或
t.GetType().FullName;
希望它对你有用。
如果你不关心显示T
,你可以使用例如 nameof(A<object>)
,假设object
符合泛型类型约束。
这会导致"不能像那样使用 A"。
如果要准确打印A<T>
,则可以使用:
$"{nameof(A<T>)}<{nameof(T)}>"
但仅限于类内部,因为T
其他地方不存在。
根据要引发该异常的位置,可以使用该类型。
在实例上,调用 this.GetType()
然后获取 Name
或 FullName
属性:
throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
typeof(A<>).Name
应该可以工作。