vb.net - 有什么方法可以基于枚举实例化一个新类吗?

标签 vb.net reflection enums instantiation

有什么方法可以通过反射实例化基于枚举的新类吗?
基本上我想删除选择案例。我有很多枚举和构建器......

例如:

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

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

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

 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 example, working with enum name.

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

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

关于vb.net - 有什么方法可以基于枚举实例化一个新类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24145252/

相关文章:

c++ - 按值或引用传递枚举?

Flask Restx 枚举模型

vb.net - 如何将 Datagridview 中的格式列更改为此值的日期类型

vb.net - VB.NET SQLite 查询中的 StackOverflow

java - 是否可以继承对匿名子模块的反射访问?

swift - 关联值和原始值可以在 Swift 枚举中共存吗?

vb.net - 在哪里处理非模态形式的实例

c# - 可序列化继承

c# - .NET - 获取反射(reflect)的 PropertyInfo 的默认值

golang反射初始化满足接口(interface)的结构