2009-05-21 35 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函數將此作爲無效格式踢回去。

你認爲什麼是對像「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版本,什麼值的範圍?一種選擇,例如,將解析它作爲一個小數,並從那裏轉換...

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

(上面只顯示了中央轉換 - 它不試圖將其融入現有的代碼)

這不適用於巨大/非常小的值,但可能不會遭受與double相同的舍入問題。

+0

我認爲這對我很有用。基本上,如果我想要一個雙打,「解析」將會提取它。但是,如果我有一個像「1000000000000.1」這樣的數字,我希望能夠長期使用。我發現小數點是128位的,但它是否具有比長期更精確的範圍? – 2009-05-22 13:01:24

相關問題