Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将字符串与类名进行比较_Vb.net - Fatal编程技术网

Vb.net 将字符串与类名进行比较

Vb.net 将字符串与类名进行比较,vb.net,Vb.net,我有一个小问题: 我有一个方法,可以解析传入字符串中的某些值,如果找到一个值,就会实例化一个新类。类名与解析的字符串相同。目前,我的代码如下所示: 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 Tes

我有一个小问题: 我有一个方法,可以解析传入字符串中的某些值,如果找到一个值,就会实例化一个新类。类名与解析的字符串相同。目前,我的代码如下所示:

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会为实例化的对象生成结果,但类的简单名称如何,目前它不是对象?

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

如果您对当前情况和传入的字符串参数感到困惑,Rafal的答案是好的。但它还是有点脆弱。如果传入参数发生更改怎么办?如果要重新构造代码,将某些类移动到不同的名称空间或程序集,该怎么办?如果这些字符串改变了怎么办?您现在必须重命名类并重新编译吗?你现在看不到神奇的字符串,但它们仍然存在


所以问问你自己——这些弦是从哪里来的?它们是由您的代码内部生成的吗?如果是这样,您可能希望生成对应于要实例化的类的枚举值,而不是字符串。如果它们是映射到类的外部字符串,那么考虑映射字符串->类型的显式映射(例如,在配置文件中)。它有点麻烦,但灵活得多。

我不确定这是否更好,字符串文字仍然存在于Type.GetType(“Test1”)中。Name://@ChristianSauer:不,您需要:Type.GetType(传入)注意,但是,您需要完全限定的类名,包括名称空间,以便
Type.GetType()
工作。此外,它是区分大小写的,即使VB.NET不是。它们是外部字符串-但它们在我的控制下。但你肯定是对的——这是一个脆弱的解决方案。您知道这样一个配置文件会是什么样子吗?一个简单的键值对列表,以传入字符串作为键,以完整的类型名作为值,应该是最简单的。在为app.config文件构建自定义配置部分方面有很多资源,尽管我不得不承认整个过程比必须的要麻烦一些。这里有一个: