2016-11-27 8 views
0

数値型の文字列をのように取得し、「123」のようなプリミティブな数値型に解析するメソッドを作成したい。コンパイル時に型が不明なので、Genericを使用することはできません。十分、公正文字列を目的のプリミティブ型に自動的にパースする方法(実行時に)

public object DynamicParse(string input, Type targetType) 
{ 
    if (targetType == typeof(int)) 
    { 
     return int.Parse(input); 
    } 
    else 
    { 
     throw new InvalidOperationException("The string cannot be converted"); 
    } 
} 

OK、しかし、私はまた、フロート、ダブル、ロング、小数を扱うようにしたい場合は...:

私の最初のアプローチでしたか?

条件文は次のようにかなり繰り返し取得します:

if (targetType == typeof(x)) 
{ 
    x.Parse(input); 
} 

5倍!

重複を避けるためにこれを自動化するより良い方法はありますか?

+0

あなたがこれをしたい正確に_why_明確ではありません。 'Type'参照を渡すことができれば、通常はその型の' Parse() 'メソッドを直接呼び出すことができます。いずれにせよ、マークされた複製には、この種の問題に対処する多数の回答があります。 –

+0

なぜですか? =>私は、入力文字列をターゲットタイプに変換しようとするパーサにこの文字列を使用しています。可能な変換の1つは数値です。その場合、.NETビルトインパーサーを使用して文字列を変換します。 – SuperJMN

+0

その質問で最も投票された答えはスマートで、うまくいきますが、私の場合は、コンパイル時に型がわかりません。提案されたソリューションは、構文解析にジェネリックスを使用します。申し訳ありませんが、私はそれが私が必要とするものではないと思います。 – SuperJMN

答えて

0

あなたはあなたのための解析を行うにConvert.ChangeTypeを使用することができます。

static T DynamicParse<T>(string s) { 
    return (T) Convert.ChangeType(s, typeof(T)); 
} 

string s = "123"; 
int i = DynamicParse<int>(s); 
double d = DynamicParse<double>(s); 

Demo.

+0

Coo!無効な変換の試みを避けるにはどうすればよいですか? try-catchブロックよりも優れた方法はありますか?私はこれをパーサーで使用し、複数回呼び出され、多くの呼び出しには解析できない文字列が含まれます。私はおそらくそれをbool TryDynamicParse(文字列、型、結果)に変更します。 – SuperJMN

+1

@SuperJMN残念ながら、 'ChangeType'は' TryChangeType'を提供していないので、このアプローチでは 'try' /' catch'が必要です。 – dasblinkenlight

関連する問題