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 会为实例化对象生成结果,但是对于一个类的简单名称,此时它还不是对象呢?

4

2 回答 2

2

如果您的字符串格式正确,您可以使用Type.GetType(string)方法来检索类型。然后,如果您在该类型上有默认构造函数,则可以使用Activator类创建实例。

于 2012-11-15T08:13:19.517 回答
1

Rafal 的回答很好,如果你被当前的情况困住了,传入的字符串参数。但它仍然有点脆弱。如果传入的参数发生变化怎么办?如果你想重构你的代码,将一些类移动到不同的命名空间或程序集中怎么办?如果这些字符串发生了变化——您现在是否必须重命名您的类并重新编译?您现在没有明确看到魔术字符串,但它们仍然存在。

所以问问自己——这些字符串是从哪里来的?它们是由您的代码在内部生成的吗?如果是这样,您可能希望生成与要实例化的类相对应的 Enum 值,而不是字符串。如果它们是映射到类的外部字符串,请考虑使用映射 String->Type 的显式映射(例如在配置文件中)。它有点麻烦,但更灵活。

于 2012-11-15T10:10:21.997 回答