2011-07-30 16 views
54

可能な複製を作成する方法:
is there a generic Parse() function that will convert a string to any type using parse?ジェネリック型キャスト機能に

私はのように、いくつかの操作を行うための汎用的な機能を作りたい:

ConvertValue<T>(string value) 

Tintの場合、関数は値をintに返し、結果を返します。 Tbooleanある場合

同様に、関数がbooleanvalueを変換し、それを返します。

これを書き込む方法は?

+6

あなたは変換クラスを見たことがありますか?あなたが何か特別なものを必要としない限り、車輪を再発明することはできません。 http://msdn.microsoft.com/en-us/library/system.convert(v=VS.85).aspx –

+0

ところで、これは変換ではなくキャストです。 –

+0

キャストすると、明示的な変換演算子が呼び出されます。 –

答えて

151

このようなものはありますか?

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

編集:あなたは、このようにそれを使用することができます

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

あなたも、このより一般的ではないstringパラメータに依存しないことができ

はタイプにU実装を提供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)?呼び出し元が例外を処理する方が適切です。

+3

うまくやった。ただし、使用上の注意点:サポートされていないコンバージョンの例外処理を実装することを忘れないでください。 –

+3

@Evan:私の更新を見てください - 私は変換メソッド内でそれを処理する良い方法がないので、呼び出し元はこの例外を処理するべきだと思います。 'default(T)'を返すことは間違っています。 – BrokenGlass

+0

@BrokenGlass:私は同意します。ヘルパーメソッド内でそれを処理するためのきれいな方法はありません。私がこれを使っていたら、 'try-catch'ブロックで呼び出しを囲みます。 –

-2

ConvertValue(System.Object o)を使用すると、o.GetType()の結果で分岐し、その値を処理する型にアップキャストすることができます。

+1

OPはジェネリックを使って具体的に何かを求めます – iandotkelly

6

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) 
    {} 
} 
+0

このテクニックは、 –

関連する問題