1. ホーム
  2. c#

[解決済み] 汎用型が文字列かどうかをテストする最良の方法?(C#)

2022-12-02 16:22:29

質問

プリミティブであろうとなかろうと、あらゆる型を許容するジェネリッククラスがあります。これに関する唯一の問題は default(T) . 値型や文字列に対して default を呼び出すと、妥当な値(例えば空文字列)に初期化されます。を呼び出すと default(T) を呼び出すと、NULLを返します。様々な理由から、プリミティブ型でない場合は、その型のデフォルトのインスタンスを確保する必要があります。 ではなく null を返します。以下は試み1です。

T createDefault()
{
    if(typeof(T).IsValueType)
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

問題点 - 文字列は値型ではありませんが、パラメータレスコンストラクタを持ちません。そこで、現在の解決策としては

T createDefault()
{
    if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

しかし、これでは手抜きのような気がします。文字列のケースを処理するもっといい方法はないでしょうか?

どのように解決するのですか?

default(string)はstring.Emptyではなく、nullであることに留意してください。あなたのコードでは、特別なケースが必要かもしれません。

if (typeof(T) == typeof(String)) return (T)(object)String.Empty;