2013-05-29 17 views
1

我在想,如果有一個更美觀/更容易閱讀的方式來寫:增加此try-catch中的可讀性?

for (int i = 0; i < 100; i++) 
{ 
    // If m.GetString(i) throws an exception, continue. 
    // Otherwise, do stuff.  
    try 
    { 
     string s = m.GetString(i); 
     continue; 
    }   
    catch (InvalidCastException) 
    { 
    } 

    // do stuff with the message that you know is not a string. 
} 

這裏併購的樣子:

msg[0] = 10 
msg[1] = "string" 
msg[2] = 2.224574743 
// Etc. 
// Assume it's different every time. 

因此,因此,當我在這個例子做m.GetString(0)它會拋出異常,因爲msg[0]uint而不是string。這是我用來獲取類型,因爲m不包含GetType,我不能編輯m。

m是我無法編輯的庫中的類Message的實例。

但是,儘管這樣工作得很好,但爲了獲得類型,它有意無效地(並且不是讀者友好的)故意創建異常,即使它在try-catch中。

有沒有更好的方法,還是我堅持這個?

編輯︰好吧,我研究了Message類更多(我應該做的開始,我的道歉)。這是一個IEnumerable<object>

+1

如果你可以避免這個異常,你應該..異常增加開銷 – 2013-05-29 14:58:30

+0

你應該找出m.GetString()拋出什麼類型的異常(假設你不能訪問它後面的代碼並且無例外地處理它)那麼只能捕獲那種類型的異常。捕捉每個可能的異常並繼續不好 –

+3

'm'的類型是什麼? –

回答

5

現在我知道mIEnumerable<object>,我覺得這是可能是你最好的選擇:

foreach (string s in m.OfType<string>()) 
{ 
    // Process s, which can't be null. 
} 

尼斯和簡單,它似乎處理所有你想要的邏輯,也就是說,它會只處理都是字符串序列中的項目,它會忽略其他類型的所有對象。

但是正如Servy指出的那樣,這將不會處理列表中的空值,因爲null根本沒有任何類型。


[我以前的答案之前,我知道的m類型]

我認爲你可以採取三種方法來這樣一句:

(1)添加bool TryGetString(int index, out string)方法到任何類型m在你的榜樣,然後做

if (m.TryGetString(i, out s)) 
    // Process s (need to check for null!) 

(2)添加bool IsString(int index)方法和調用,調用0123之前。

if (m.IsString(i)) 
{ 
    s = m.GetString(i); 
    // Process s (need to check for null!) 

(3)另外,你可能暴露通過類似GetObject(int index)項目,然後像做Iiya建議:

string s = m.GetObject(i) as string; 

if (s != null) 
    // Process s 

我認爲(1)或(3)將是最好的,雖然如果我們有關於m的更多信息,我們可能會建議更好的解決方案。

+0

是的,m是IEnumerable 。我現在會嘗試你的第四個選項。 –

+1

請注意,如果您有任何'null'對象*應該*表示可能是問題的字符串;不知道您的數據以及您希望如何使用它,我們無法知道它是否合適。 – Servy

+0

是Servy有一個好點。如果對象列表中的項目爲空,則它不能有任何類型(因爲當然沒有任何對象具有任何類型!) –

2

如果你想只處理數據的非強類型的序列串,使用下面的代碼:

for (int i = 0; i < 100; i++) 
{ 
    string s = m[i] as string; 

    if(s != null) 
    { 

    } 
} 
+0

這是否仍然允許非字符串,因爲有類型將成功轉換爲字符串? – emd

+1

s可能是一個空字符串 –

+0

@emd'string'是密封的,所以它不能有一個子類型,因爲除了'string'外,沒有任何類型可以轉換爲字符串。 – Servy