2013-02-11 46 views
1

顯然這不是你想做的事情,除非你處於無助的境地,但是沒有人有這樣的例子的好例子更清晰的方法名):將字符串轉換爲未知的原始類型

public static object ConvertToBestGuessPrimitive(string toConvert) 
{ 
    if(looksLikeAnInt) 
    { 
     return as an int; 
    } 
    else if(looksLikeABoolean) 
    { 
     return as a boolean; 
    } 
    else 
    { 
     return as a string; 
    } 
} 

我唯一的想法是鏈一起在一個合理的順序一堆的TryParse方法一起回落到字符串,如果沒有什麼作品。任何人都能想到更好的東西嗎?這個問題可能已經在某個地方得到了解答,但我似乎無法找到任何有用的結果,因爲使用了過於通用的搜索術語。

編輯 - 由於有人批評沒有例子,這將是多麼有用,這裏有一個我想出來滿足一個具體的需求(不合理)...說我解析一個錯誤日誌文件,我得到從一個不受控制的來源。日誌文件具有方法名稱和參數,這些名稱和參數是爲發生錯誤的位置提供的。我想通過找到最匹配的方法和參數並嘗試再次調用它們來自動測試錯誤條件。也許是一個愚蠢的例子(請不要試圖想出「但你可以在這種情況下做到這一點」的反應,因爲這只是一個例子),但它說明了幾點:1)輸入超出了我的控制範圍。 2)最好的猜測是基於找到合適匹配的一些標準。例如:「10/2/2012」更可能意味着DateTime比字符串。

+0

爲什麼不然後聲明該方法爲動態如果沒有我會做一個switch語句,你甚至會在哪裏使用'toConvert'檢查方法名現在你應該足夠聰明來想出一個方法名稱來描述你在做什麼或試圖做什麼'ConvertToPrimitiveType' – MethodMan 2013-02-11 14:56:26

+1

我不明白。你會如何使用這種方法?它如何有用? – nmat 2013-02-11 15:01:14

+0

我同意@nmat。也許你可以向我們展示一個你想使用它的例子。 – 2013-02-11 15:04:10

回答

0

實際上,試圖解析是最合理的方式,因爲解析是針對文化的。如果您只是要求.NET Framework解析,您將自動遵守當前的文化設置。這與手動分析方法(可能基於正則表達式)形成對比。

另外,我不知道任何字符串可以在bool,int,float和DateTime之間模糊地解釋。 (明顯的例外是任何int也是一個float,所以首先解析int)。

更好的名字是ConvertToBestGuessPrimitiveType。我添加了「Type」。

1

所以你想擺脫if-elses?那麼像這樣的事情:

interface IConverter 
{ 
    bool TryConvert(string obj, out object result); 
} 

class IntConvert : IConverter 
{ 
    public bool TryConvert(string obj, out object result) { /* stuff here */ } 
} 

class BoolConverter : IConverter {...} 

// etc. 
List<IConverter> converters = new List<IConverter>(); 
converters.Add(new IntConvert()); 
converters.Add(new BoolConvert()); 

public static object ConvertToBestGuessPrimitive(string toConvert) 
{ 
    object obj; 
    foreach(var converter in converters) { 
    if(converter.TryConvert(toConvert, out obj)) 
     return obj; 
    } 

    return null; 
} 

更新:謝謝Servy的建議。

+1

你用一個檢查解析每個字符串兩次,然後轉換方法;將它們組合成TryParse方法可能會更好。 – Servy 2013-02-11 15:09:13

+0

絕對同意。感謝您的建議。我已經更新了這個例子。 – 2013-02-11 15:14:43

相關問題