web-dev-qa-db-ja.com

ジェネリック型キャスト関数の作成方法

可能性のある複製:
parseを使用して文字列を任意の型に変換する汎用Parse()関数はありますか?

次のようないくつかの操作を実行するための汎用関数を作成したい:

ConvertValue<T>(string value)

Tintの場合、関数は値をintに変換し、結果を返します。

同様に、Tbooleanの場合、関数はvaluebooleanに変換して返します。

これを書く方法は?

63
Riz

このようなもの?

_public static T ConvertValue<T>(string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}
_

その後、次のように使用できます。

_int val = ConvertValue<int>("42");
_

編集:

stringUを実装する場合、IConvertibleパラメーターに依存せずにこれをより一般的に行うこともできます。つまり、2つの型パラメーターを指定する必要があります。

_public static T ConvertValue<T,U>(U value) where U : IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}
_

Convert.ChangeType()によって発生する可能性のあるInvalidCastException例外をキャッチすることを検討しましたが、この場合は何を返しますか? default(T)?呼び出し元に例外を処理させる方が適切だと思われます。

178
BrokenGlass

おそらくIConvertibleアプローチほど見栄えはよくありませんが、Tを返すために、簡単なチェックtypeof(T)を常に使用できます。

public static T ReturnType<T>(string stringValue)
{
    if (typeof(T) == typeof(int))
        return (T)(object)1;
    else if (typeof(T) == typeof(FooBar))
        return (T)(object)new FooBar(stringValue);
    else
        return default(T);
}

public class FooBar
{
    public FooBar(string something)
    {}
}
9
BrandonAGr