vb.net – 有没有一种优雅的方式来编写这段代码?
发布时间:2020-12-17 07:27:25 所属栏目:百科 来源:网络整理
导读:我继承了一些代码,当我看到它时,它让我感到畏缩.是否有更优雅的方式来写下面的内容? Dim myItem As DTO.MyBaseClass = NothingDim myType As String = GetTypeString()Select Case myType Case Is = "Case1" myItem = Bus.BusManager(Of DTO.MyClass1).Read
我继承了一些代码,当我看到它时,它让我感到畏缩.是否有更优雅的方式来写下面的内容?
Dim myItem As DTO.MyBaseClass = Nothing Dim myType As String = GetTypeString() Select Case myType Case Is = "Case1" myItem = Bus.BusManager(Of DTO.MyClass1).Read() Case Is = "Case2" myItem = Bus.BusManager(Of DTO.MyClass2).Read() '... etc etc for 30 lines 有没有办法从字符串到类类型创建一个映射,然后只有这样的行?或类似的东西? myItem = Bus.BusManager(Of MappingDealy(myType)).Read() 解决方法
由于BusManager是Generic,因此您传入的类型为< type>必须在编译时指定.它不像您可以在运行时更改的传统参数.
从您列出的代码中不清楚BusManager实际上做了什么.如果它所做的只是创建Generic类型的实例,那么创建它的人可能并不真正理解泛型.您是否有能力重新设计BusManager的工作方式,或者您是否仅限于使用它? 正如@jmoreno所提到的,您可以使用反射从包含类型名称的字符串创建类型的实例.这是如何工作的: Imports System.Reflection Imports System.IO Public Class ObjectFactory Private Shared Function CreateObjectFromAssembly(ByVal assembly As Assembly,ByVal typeName As String) As Object ' resolve the type Dim targetType As Type = assembly.GetType(typeName) If targetType Is Nothing Then Throw New ArgumentException("Can't load type " + typeName) End If ' get the default constructor and instantiate Dim types(-1) As Type Dim info As ConstructorInfo = targetType.GetConstructor(types) Dim targetObject As Object = info.Invoke(Nothing) If targetObject Is Nothing Then Throw New ArgumentException("Can't instantiate type " + typeName) End If Return targetObject End Function Public Shared Function CreateObject(ByVal typeName As String) As Object Return CreateObjectFromAssembly(Assembly.GetExecutingAssembly,typeName) End Function Public Shared Function CreateObject(ByVal typeName As String,ByVal assemblyFileName As String) As Object Dim assemblyFileInfo = New FileInfo(assemblyFileName) If assemblyFileInfo.Exists Then Return CreateObjectFromAssembly(Reflection.Assembly.LoadFrom(assemblyFileName),typeName) Else Throw New ArgumentException(assemblyFileName + " cannot be found.") End If End Function End Class 在生产应用程序中,我可能会将所有这些方法的返回类型设置为我的基类或接口.只需确保传入完整的typeName,包括命名空间. 有了这个工厂类,那么代码的优雅版本将如下所示: Dim myItem as DTO.MyBaseClass = ObjectFactory.CreateObject("DTO." & GetTypeString()) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |