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

时间:2018-04-18 11:00:40

标签: c# generics nameof

假设我有类型

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

3 个答案:

答案 0 :(得分:9)

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

这导致&#34;不能像那样使用A.&#34;

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

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

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

答案 1 :(得分:3)

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

在实例上,请致电this.GetType(),然后获取NameFullName媒体资源:

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

答案 2 :(得分:2)

你试过了吗?

typeof(T).FullName;

t.GetType().FullName;

希望它适合你。