2008-12-20 56 views
2

此問題是previous question i asked的擴展(已回答)。我正在重構我的代碼,並嘗試使用各種重構解決方案。這是鑄造的一個不合適的用法嗎?

解決的辦法之一,我想出了(但不開心..記住,我只是提供一些個人的編碼風格實驗)WSA下面的代碼: -

if (data is ITagElement) 
{ 
    if (((ITagElement) data).TagList.IsNullOrEmpty()) 
    { 
     ((ITagElement) data).TagList = new List<Tag>(); 
    } 

    ((ITagElement) data).TagList.Add(new Tag 
    { 
     K = xmlReader.GetAttribute("k"), 
     V = xmlReader.GetAttribute("v") 
    }); 
} 

通知我如何是否將父對象data轉換爲接口類型,它將多次拋出?代碼有效,但我覺得這是代碼味道 - >它不是非常有效。我覺得這樣可以改進 - 來自任何專家的想法?

回答

11

這個怎麼樣,所以你只能做投一次:

ITagElement someData = data as ITagElement 
if (someData != null) 
{ 
    if (someData.TagList.IsNullOrEmpty()) 
    { 
     someData.TagList = new List<Tag>(); 
    } 

    someData.TagList.Add(new Tag 
    { 
     K = xmlReader.GetAttribute("k"), 
     V = xmlReader.GetAttribute("v") 
    }); 

} 
+0

乾杯!我喜歡! :) – 2008-12-21 06:42:06

2

我想這是因爲這樣更清楚:

if (data is ITagElement) 
{ 
    ITagElement dataAsTagElement = (ITagElement)data; 
    if (dataAsTagElement.TagList.IsNullOrEmpty()) 
    { 
     dataAsTagElement.TagList = new List<Tag>(); 
    } 

    dataAsTagElement.TagList.Add(new Tag 
    { 
     K = xmlReader.GetAttribute("k"), 
     V = xmlReader.GetAttribute("v") 
    }); 
} 

這將是更好,因爲它避免了投3次換取一個指針。它的眼睛也容易得多!

3

使用as operator得到的是和投在同一個OP:

ITagElement tagElement = data as ITagElement; 
if (tagElement == null) return; 

if (tagElement.TagList.IsNullOrEmpty()) { 
    tagElement.TagList = new List<Tag>(); 
} 

tagElement.TagList.Add(new Tag 
{ 
    K = xmlReader.GetAttribute("k"), 
    V = xmlReader.GetAttribute("v") 
});