有任何方法可以基于enum实例化一个新类



有没有办法通过反射实例化一个基于enum的新类?
我想移除选择大小写。我有很多枚举和构建器....

例如:

Public MustInherit Class GeneralClass
    '...
    Enum GeneralClassType
         A = 1
         B = 2
    End Enum
    Public Shared Function BuildClass(Val as Integer, ParamArray par() as Object) as GeneralClass
        Dim NewObject as GeneralClass = Nothing
        Select Case Ctype(Val, GeneralClassType)
              Case GeneralClassType.A
                   NewObject = new A 
              Case GeneralClassType.B
                   NewObject = new B
              Case else
                   throw new exception("invalid type.")
        end select
        NewObject.setPar(par)
        return NewObject
    end function
End Class
Public Class A
    Inherits GeneralClass
    '...
End Class
Public Class B
    Inherits GeneralClass
    '...
End Class

Function BuildClass根据从数据库获取的类型和参数构建一个类。但是我需要Case来创建一个类型的新实例。

我知道我可以通过反射实例化一个类,但前提是你知道最终类型。没有办法做到这一点,像保存类名在数据库?

 public function InstantiateClass(of T)() as T
     Dim NewObject as GeneralClass = GetType(T).GetConstructor(New Type() {}).Invoke(New Object() {})
     return NewObject
 end class
我可以得到像 这样的东西
Dim Var1 as GeneralClass = InstantiateClass(of A)()

并在Build函数中使用此实例。但是这里我需要知道类型A



BaseTest示例,使用enum名称。

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim BaseFlag As Integer = 2
        Dim BaseName As String = "Create a class from enum"

        Dim T As BaseTest = BaseTest.Build(BaseFlag, BaseName)
        MsgBox(T.GetClassTypeName)
    End Sub
End Class
Public MustInherit Class BaseTest
    Protected Name As String
    Enum TestType
        TestA = 1
        TestB = 2
        TestC = 3
    End Enum
    Public Function GetClassTypeName() As String
        Return String.Concat(Name, ". The final class is: ", Me.GetType.FullName, "")
    End Function
    Public Shared Function Build(BaseFlag As Integer, Name As String) As BaseTest
        Dim NS As String = GetType(BaseTest).FullName
        Dim Index As Integer = NS.LastIndexOf(".") + 1
        NS = NS.Substring(0, Index)
        Dim ClassType As String = CType(BaseFlag, TestType).ToString()
        Dim Test As BaseTest = Activator.CreateInstance(Type.GetType(NS & ClassType))
        Test.Name = Name
        Return Test
    End Function
End Class
Public Class TestB
    Inherits BaseTest
End Class

第一步是弄清楚如何获得反射以创建给定类名作为字符串的对象实例。下面是这样做的一个例子:

Dim o As Object = Activator.CreateInstance(Type.GetType("MyNameSpace.A"))

使其工作后,需要做的就是获取枚举值的字符串名称。为此,您所需要做的就是在枚举对象上调用ToString方法,例如,在您的示例中:

Dim className As String = CType(Val, GeneralClassType).ToString()

一旦有了这些,就可以简单地将类名连接到名称空间来创建对象:

Dim o As Object = Activator.CreateInstance(Type.GetType("MyNameSpace." & className))

你发布的例子是类型安全的,而使用反射,像这样,不是。此外,反射可能会稍微慢一些。您需要根据您的具体情况来决定是否值得放弃这种类型安全性和效率。

最新更新