web-dev-qa-db-ja.com

タイプを指定しないC#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."

16
Thomas Flinkow

Tを表示する必要がない場合は、次のように使用できます。 nameof(A<object>)objectがジェネリック型の制約に準拠していると仮定します。

これは、「そのようなAを使用できない」という結果になります。

正確に印刷したい場合はA<T>、次のように使用できます。

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

ただし、Tは他の場所には存在しないため、クラス内からのみです。

12
Rotem

例外を発生させたい場所に応じて、タイプを使用できます。

インスタンスでthis.GetType()を呼び出してから、NameまたはFullNameプロパティを取得します。

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

やってみました:

typeof(T).FullName;

または

t.GetType().FullName;

それがあなたのために働くことを願っています。

6
PachecoDt