タイプがあると仮定します
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."
。
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(T).FullName;
または
t.GetType().FullName;
それがあなたのために働くことを願っています。