2013-12-18 8 views
6

.Netで反射を使用するtypeof(DateTime?).Nameは "Nullable`1"を返します。typeof(DateTime?)。Name == Nullable`1

実際の型を文字列として返す方法はありますか。 (この場合「DateTime」または「System.DateTime」)

DateTime?Nullable<DateTime>です。この点以外にも、nullable型の型を探しています。

+4

実際の型は 'NULL可能' – StuartLC

+0

質問を取り出しマークです。 –

+1

これはうまくいきますが、コード内の疑問符を削除すると、おそらく何かが壊れるでしょう。 – James

答えて

10

このケースであなたを助けることができるNullable.GetUnderlyingType方法があります。おそらくあなたはNULL可能と非NULL可能、両方のタイプを使用してすることがあります(私は仮定している)ので、あなたがあなた自身のユーティリティメソッドを作成したいと思ってしまいます:

public static string GetTypeName(Type type) 
{ 
    var nullableType = Nullable.GetUnderlyingType(type); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType.Name; 
    else 
     return type.Name; 
} 

使用法:

Console.WriteLine(GetTypeName(typeof(DateTime?))); //outputs "DateTime" 
Console.WriteLine(GetTypeName(typeof(DateTime))); //outputs "DateTime" 

編集:私はあなたにもそれが非NULL可能だ場合は、わずかに基になる型を取得したり、既存の型を使用するために、これを変更することができ、その場合にはタイプ、上の他のメカニズムを使用している可能性が疑われる:

public static Type GetNullableUnderlyingTypeOrTypeIfNonNullable(this Type possiblyNullableType) 
{ 
    var nullableType = Nullable.GetUnderlyingType(possiblyNullableType); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType; 
    else 
     return possiblyNullableType; 
} 

そしてそれは方法のためのひどい名前ですが、私は(私は誰かがより良いものを提案している場合、それを変更させていただきます!)そして、

として1を思い付くしてくれないんだけど拡張メソッドは、あなたの使い方は次のように次のようになります。

public static string GetTypeName(this Type type) 
{ 
    return type.GetNullableUnderlyingTypeOrTypeIfNonNullable().Name; 
} 

または

typeof(DateTime?).GetNullableUnderlyingTypeOrTypeIfNonNullable().Name 
+2

'public static string GetTypeName(このタイプタイプ)'拡張メソッド! –

5

はPatrykで指摘したように:

typeof(DateTime?).GetGenericArguments()[0].Name

+1

実際には型を取得するのに一般的に使用されるメソッドであれば、これは 'List 'のような型のジェネリック型を引き出すことになるだけです。 –

+0

@ChrisSinclair型自体が 'Nullable'であるかどうかを確認するためのチェックを追加し、必要な振る舞いであれば例外をスローすることができます。 – Servy

+0

@謝辞:ああ、確かに。私はちょうど彼が意図された使用法の完全な範囲を必ずしも知っているわけではないので、これの警告のチャド1を指摘したいと思います。彼は後で道を踏み出して驚いた。 –

2

クリス・シンクレアコードは動作しますが、私はそれがより簡潔に書き直しました。

public static Type GetNullableUnderlyingTypeIfNullable(Type possiblyNullableType) 
    { 
     return Nullable.GetUnderlyingType(possiblyNullableType) ?? possiblyNullableType; 
    } 

そして、それを使用します。

GetNullableUnderlyingTypeIfNullable(typeof(DateTime?)).Name 
関連する問題