【问题标题】:Create a new instance of a type given as parameter创建作为参数给出的类型的新实例
【发布时间】:2010-03-07 15:57:18
【问题描述】:

我搜索了答案并找到了一些 c#-examples,但无法在 vb.net 中运行:

我想到了类似的东西:

public function f(ByVal t as System.Type)
  dim obj as t
  dim a(2) as t

  obj = new t
  obj.someProperty = 1
  a(0) = obj

  obj = new t
  obj.someProperty = 2
  a(1) = obj

  return a
End Function

我知道,我可以使用 Activator.Create... 方法创建一个新实例,但是如何创建这种类型的数组或只声明一个新变量? (昏暗)

提前致谢!

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    这真的取决于类型本身。 如果类型是引用类型并且有一个空的构造函数(一个接受零参数的构造函数),下面的代码应该创建一个它的实例: 使用泛型:

    Public Function f(Of T)() As T
        Dim tmp As T = GetType(T).GetConstructor(New System.Type() {}).Invoke(New Object() {})
        Return tmp
    End Function
    

    使用类型参数:

    Public Function f(ByVal t As System.Type) As Object
        Return t.GetConstructor(New System.Type() {}).Invoke(New Object() {})
    End Function
    

    【讨论】:

    • @M.A. Hanin 的回答很好,如果可以的话,一定要使用通用版本。而不是 .Invoke(New Object()) 我认为你需要使用 .Invoke(Nothing)。此外,所有这一切都表明,99% 的时间我看到有人这样做,他们这样做是出于错误的原因,或者正在以非常非常艰难的方式做某事。反射在少数情况下很有用,但通常它只会让您的代码更加混乱。
    • 这个答案正是我所需要的!我仍在努力让stackoverflow.com/questions/2386690/… 工作,所以这似乎是一个解决方案。
    • @Stex,很高兴我能帮上忙。关于另一个问题,我提出了另一个解决方案,但现在我发现它可能无关紧要。 @Chris Haas,感谢您的评论。我认为你对那 99% 的看法是正确的 - 使用泛型和反射似乎太有利可图了,尽管很多时候它被证明是过度杀伤/过度复杂。
    【解决方案2】:

    我个人更喜欢这种语法。

    Public Class Test(Of T As {New})
        Public Shared Function GetInstance() As T
            Return New T
        End Function
    End Class
    

    或者如果你想限制可能的类型:

    Public Class Test(Of T As {New, MyObjectBase})
        Public Shared Function GetInstance() As T
            Return New T
        End Function
    End Class
    

    【讨论】:

    • 是的,这好多了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多