没有指定类型的 C# nameof 泛型类型
C# nameof generic type without specifying type
假设我有类型
public class A<T> { }
在代码的某处我想抛出与该类型的不正确使用相关的异常:
throw new InvalidOperationException("Cannot use A<T> like that.");
到目前为止一切顺利,但我不想硬编码 classes 名称,所以我想我可以使用
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.");
但那些产量
Incorrect number of type parameters.
和
Type argument is missing.
我绝对不想对 classes 名称进行硬编码,因为它以后可能会更改。如何获得 class 的名称,最好通过 nameof
?
最理想的是,我想要达到的是"Cannot use A<T> like that."
或"Cannot use A like that."
。
如果您不关心显示 T
,您可以使用例如nameof(A<object>)
,假设 object
符合通用类型约束。
这导致 "Cannot use A like that."
如果你想精确打印 A<T>
,你可以使用:
$"{nameof(A<T>)}<{nameof(T)}>"
但仅来自 class,因为 T
在其他地方不存在。
根据您想引发异常的位置,您可以使用类型。
在实例上,调用 this.GetType()
然后获取 Name
或 FullName
属性:
throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
你试过了吗:
typeof(T).FullName;
或
t.GetType().FullName;
希望对你有用。
假设我有类型
public class A<T> { }
在代码的某处我想抛出与该类型的不正确使用相关的异常:
throw new InvalidOperationException("Cannot use A<T> like that.");
到目前为止一切顺利,但我不想硬编码 classes 名称,所以我想我可以使用
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.");
但那些产量
Incorrect number of type parameters.
和
Type argument is missing.
我绝对不想对 classes 名称进行硬编码,因为它以后可能会更改。如何获得 class 的名称,最好通过 nameof
?
最理想的是,我想要达到的是"Cannot use A<T> like that."
或"Cannot use A like that."
。
如果您不关心显示 T
,您可以使用例如nameof(A<object>)
,假设 object
符合通用类型约束。
这导致 "Cannot use A like that."
如果你想精确打印 A<T>
,你可以使用:
$"{nameof(A<T>)}<{nameof(T)}>"
但仅来自 class,因为 T
在其他地方不存在。
根据您想引发异常的位置,您可以使用类型。
在实例上,调用 this.GetType()
然后获取 Name
或 FullName
属性:
throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
你试过了吗:
typeof(T).FullName;
或
t.GetType().FullName;
希望对你有用。