微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – 有没有一种优雅的方式来编写这段代码?

我继承了一些代码,当我看到它时,它让我感到畏缩.是否有更优雅的方式来写下面的内容

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())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐