不指定类型的泛型类型的 C# 名称



假设我有类型

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() 然后获取 NameFullName 属性:

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

typeof(A<>).Name应该可以工作。

相关内容

  • 没有找到相关文章

最新更新