2012-11-15 75 views
1

我有一點問題: 我有一個方法來解析一個傳入的字符串的某些值,如果找到一個值,一個新的類被實例化。類名與解析的字符串相同。此刻,我的代碼看起來是這樣的:比較字符串到類名

Public Class Test1 
End Class 

Public Class Important 
End Class 

Public Class DoWork 
Public Sub DoWork(incoming as String) 
Select case incoming 
case "Test1" 
dim myobj as new Test1 
Case "Important" 
dim myobj as new Important 
End Select 
End Sub 
End Class 

我不喜歡的字符串文字像「Test1的」 - 我可以將它們存儲在一個恆定的,但如果類的名稱改變,他們必須得改變。有沒有辦法用類的名稱替換文字? 我知道me.gettype產生實例化對象的結果,但是一個類的簡單名稱在這個時候是不是對象呢?

回答

2

如果您的字符串格式正確,則可以使用Type.GetType(string)方法檢索類型。然後,如果您具有該類型的默認構造函數,則可以使用Activator類創建實例。

+0

我不確定這是否更好,字符串文字仍然存在於Type.GetType(「Test1」)。Name:/ –

+0

@ChristianSauer:不,你這樣做:Type.GetType(incoming) –

+0

Thx,now我明白了! –

1

如果你對目前的情況和傳入的字符串參數感到困惑,Rafal的回答很好。但它仍然有點脆弱。如果傳入的參數更改會怎樣?如果你想重組你的代碼,將一些類移動到不同的命名空間或程序集呢?如果這些字符串發生了變化 - 你現在是否必須重命名你的類並重新編譯?你現在看不到這些神奇的字符串,但它們仍然存在。

所以問問自己 - 這些字符串從哪裏來?它們是由你的代碼在內部生成的嗎?如果是這樣,您可能希望生成一個與要實例化的類相對應的Enum值,而不是字符串。如果它們是映射到類的外部字符串,請考慮進行顯式映射(例如在配置文件中)map String-> Type。這有點麻煩,但更靈活。

+0

它們是外部字符串 - 但它們在我的控制之下。但你肯定是對的 - 這是一個脆弱的解決方案。你有一個想法如何這樣的配置文件可以? –

+1

鍵入值對的簡單列表(以傳入字符串作爲鍵和完整類型名稱作爲值)應該是最簡單的。在構建app.config文件的自定義配置部分中有很多資源,儘管我必須承認整個過程比它必須更麻煩。這裏有一個:http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx –