2009-05-21 7 views
0

からデータベース(long、DBNull、bool、stringなど)から返される型を互換性のあるに変換できる社内ライブラリ用の型変換器を作成しています。タイプ。文字列を未知の数値型に変換する正しい方法は何ですか?

このすべては、いずれかのキャストできる項目のためのフィンとダンディ作品:

try { return (T)value } catch(InvalidCaseException) { } 

または解析することができます。

はしかし、私は時にレンガの壁に当たっていConvert to a Nullable<T> from a string using Reflection

を見ます私はこの希望のふるまいが欲しい:

Assert.That(
    2, 
Is.EqualTo(
    Converter<long>.Convert("2.1") 
)); 

問題はth e Pasre関数とTryParse関数は、実際の望ましい結果が10進数を切り捨てるときに、これを無効な形式として戻します。

あなたは反射を使用して不明な値型に「2.1」のような文字列を解析するための最良の方法だろうどう思いますか?

編集:現在、私は使用しています:

if (Nullable.GetUnderlyingType(t) != null) 
{ 
    t = Nullable.GetUnderlyingType(t); 
} 

MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) }); 

if (parse != null) 
{ 
    object parsed = parse.Invoke(null, new object[] { value.ToString() }); 
    return (T)parsed; 
} 
else 
{ 
    throw new InvalidOperationException("The value you specified is not a valid " + typeof(T).ToString()); 
} 

答えて

4

.NETのどのバージョン、および値の何範囲? 1つのオプションは、例えば、

T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T)) 

...小数としてそれを解析し、そこからそれを変換することです(上記はちょうど中央の変換を示して - それはあなたの既存のコードにそれに合うようにしようとしません。 )

これは、巨大な/非常に小さい値では機能しませんが、おそらくdoubleと同じ丸めの問題はありません。

+0

私はそれが私のために働くと思います。基本的に、私はダブルをしたい場合は、 "解析"はそれを拾うでしょう。しかし、もし私が "1000000000000.1"のような番号を持っていれば、それは長く使えるようになることを望みます。私は10進数が128ビットであることを見ていますが、それは長いよりも完全に正確な範囲を持っていますか? –

+0

主な値に関しては、それはわずか96ビットです - そう、長い(64ビット)よりも長い。結果としてCPUのサポートは遅くなります。 –

関連する問題