1. ホーム
  2. c#

C#でジェネリックメソッドの型パラメータをチェックする

2023-08-26 18:26:33

質問

C#でこのようなことをすることは可能でしょうか?

public void DoSomething<T>(T t)  
{
    if (T is MyClass)
    {
        MyClass mc = (MyClass)t 
        ...
    }
    else if (T is List<MyClass>)
    {
        List<MyClass> lmc = (List<MyClass>)t
        ...
    }
}

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

はい。

if (typeof(T) == typeof(MyClass))
{
    MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
    List<MyClass> lmc = (List<MyClass>)(object) t;
}

オブジェクトへのキャストを経由する必要があるのは少し奇妙ですが、これはジェネリックが機能する方法なのです。

もちろん、別の選択肢として、通常の実行時間チェックを使用することもできます。

MyClass mc = t as MyClass;
if (mc != null)
{
    // ...
}
else
{
    List<MyClass> lmc = t as List<MyClass>;
    if (lmc != null)
    {
        // ...
    }
}

この場合、最初のコードブロックとは異なる振る舞いをします。 t がヌルである場合は、もちろん異なる動作をします。

私なら を試す は可能な限りこのようなコードを避けるようにします - 時には必要かもしれませんが、ジェネリックメソッドの考え方は ジェネリック を書けるようにすることです。