からデータベース(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());
}
私はそれが私のために働くと思います。基本的に、私はダブルをしたい場合は、 "解析"はそれを拾うでしょう。しかし、もし私が "1000000000000.1"のような番号を持っていれば、それは長く使えるようになることを望みます。私は10進数が128ビットであることを見ていますが、それは長いよりも完全に正確な範囲を持っていますか? –
主な値に関しては、それはわずか96ビットです - そう、長い(64ビット)よりも長い。結果としてCPUのサポートは遅くなります。 –