ジェネリック型引数の型名を取得するにはどうすればよいですか?


99

次のようなメソッドシグネチャがある場合

public string myMethod<T>( ... )

メソッド内で、型引数として指定された型の名前を取得するにはどうすればよいですか?私はと同様のことをしたいのですがtypeof(T).FullName、それは実際にうまくいきます...


10
typeof(T).FullName うまくいくはずです。代わりに何が起こっていますか?
Nathan Taylor

そのステートメントでコンパイラエラーが発生しました。ただし、現在は機能しているため、他のエラーが原因であると考えられます。ありがとう!
Tomas Aschan 2010

回答:


156

コードが機能するはずです。 typeof(T).FullName完全に有効です。これは完全にコンパイルされて機能するプログラムです:

using System;

class Program 
{
    public static string MyMethod<T>()
    {
        return typeof(T).FullName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyMethod<int>());

        Console.ReadKey();
    }

}

上記の印刷を実行すると(期待どおり):

System.Int32

必ずMyMethod <int >>()を使用してテストし、何が得られるかを確認してください...そのシナリオで基本となる型を気にする場合は、null許容型を考慮する必要があります。
GR7、2010

1
<int?>」を意味します。そうであれば機能しますが、System.Nullable<int>(フルネーム構文で)期待どおりの結果が得られます...
リードコプシー2010

私はすでに解決策を持っていますが(何らかの理由でうまくいかなかったものの...)、ベストアンサーを書くための担当者にはるかにポイントを与えます=)
Tomas Aschan 2010

1
私はそれを想定し、同じことnameof(T)typeof(T).Nameするので、これはちょうど私を助けました。結局nameof(T)は戻りますT
ダービード

5

typeof(T).Nameそしてtypeof(T).FullName私のために働いています。引数として渡された型を取得します。


1
ああ。渡した型がNullableの場合、基になる型を取得するには、typeof(T).GetGenericArguments()[0]のようなものを使用する必要があります
GR7

型がnull可能かどうかを確認するには、typeof(T).IsGenericTypeを使用します。そうである場合は、次を使用してNameまたはFUllNameを取得します((Type)typeof(T).GetGenericArguments()[0 ])。名前
GR7

1

利用可能なTのインスタンスがあると仮定すると、他のタイプと何の違いもありません。

var t = new T();

var name = t.GetType().FullName;

2
あなたも、T .... typeof演算(T)なしインスタンスに罰金を作品のインスタンスを必要としないサブクラスでは、メソッドに渡された場合...ユアーズ(引数として)異なる振る舞いを与えるだろう...
リードCopsey

1
このコードの問題は、Tにパラメーターのないコンストラクターがない場合、機能しないことです。
Nathan Taylor

@Nathan-これは、Tのインスタンスを取得することを示す単なる例でした。おそらく、ジェネリックメソッドでは、T型を使用できるようになります。@リード-あなたはもちろん正しいです、私はそれが彼が求めていたものだと思いました。
2010

別の問題は、Tが抽象クラスまたはインターフェースである場合です-上記のコードは機能しません。ジェネリック型制約(「where」)がある場合、コンストラクターがわかっており、型をインスタンス化する理由がある場合があるため、このタイプのコードは安全です。それ以外のインスタンス化は無駄です。
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.