1. ホーム
  2. c#

[解決済み] C#のジェネリックと型チェック

2023-02-20 22:04:47

質問

あるメソッドで IList<T> をパラメータとして使用するメソッドがあります。 私はその T オブジェクトが何であるかを調べて、それに基づいて何かをする必要があります。 私が使おうとしていたのは T の値を使おうとしましたが、コンパイラはそれを許しません。 私の解決策は以下の通りです。

private static string BuildClause<T>(IList<T> clause)
{
    if (clause.Count > 0)
    {
        if (clause[0] is int || clause[0] is decimal)
        {
           //do something
        }
        else if (clause[0] is String)
        {
           //do something else
        }
        else if (...) //etc for all the types
        else
        {
           throw new ApplicationException("Invalid type");
        }
    } 
}

もっと良い方法があるはずです。 の型をチェックする方法はありますか? T の型をチェックして switch ステートメントを使用するのでしょうか?

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

オーバーロードを使用するとよいでしょう。

public static string BuildClause(List<string> l){...}

public static string BuildClause(List<int> l){...}

public static string BuildClause<T>(List<T> l){...}

または、ジェネリックパラメータの型を検査することができます。

Type listType = typeof(T);
if(listType == typeof(int)){...}