2010-11-12 2 views
1

J'ai une bibliothèque de classes qui contient un certain nombre de classes. Je voudrais créer dynamiquement une instance de l'une de ces classes, définir ses propriétés et appeler une méthode.Comment créer dynamiquement une instance d'un objet lorsque le nom de l'objet est transmis en tant que chaîne? (VB.NET)

Exemple:

Public Interface IExample 
    Sub DoSomething() 
End Interface 

Public Class ExampleClass 
    Implements IExample 

    Dim _calculatedValue as Integer 

    Public Property calculatedValue() as Integer 
     Get 
      return _calculatedValue 
     End Get 
     Set(ByVal value As Integer) 
      _calculatedValue= value 
     End Set 
    End Property   

    Public Sub DoSomething() Implements IExample.DoSomething 
     _calculatedValue += 5 
    End Sub 
End Class 

Public Class Example2 
    Implements IExample 

    Dim _calculatedValue as Integer 

    Public Property calculatedValue() as Integer 
     Get 
      return _calculatedValue 
     End Get 
     Set(ByVal value As Integer) 
      _calculatedValue = value 
     End Set 
    End Property   

    Public Sub DoSomething() Implements IExample.DoSomething 
     _calculatedValue += 7 
    End Sub 
End Class 

Donc, je veux créer ensuite le code comme suit.

Private Function DoStuff() as Integer 
    dim resultOfSomeProcess as String = "Example2" 

    dim instanceOfExampleObject as new !!!resultOfSomeProcess!!! <-- this is it 

    instanceOfExampleObject.calculatedValue = 6 
    instanceOfExampleObject.DoSomething() 

    return instanceOfExampleObject.calculatedValue 
End Function 

Example1 et Example2 peuvent avoir des propriétés différentes, que je dois mettre ...

Est-ce faisable?

Répondre

4

Vous pouvez utiliser Activator.CreateInstance pour cela. La façon la plus facile (OMI) est d'abord créer un objet Type et de transmettre cela à Activator.CreateInstance:

Dim theType As Type = Type.GetType(theTypename) 
If theType IsNot Nothing Then 
    Dim instance As IExample = DirectCast(Activator.CreateInstance(theType), IExample) 
    ''# use instance 
End If 

Notez cependant que la chaîne contenant le nom du type doit contenir le nom de type complet, y compris l'espace de noms.

Si vous avez besoin d'accéder à des membres plus spécialisés sur les types, vous aurez toujours besoin de les lancer (sauf si VB.NET a incorporé quelque chose de similaire à dynamic en C#, que je ne connais pas).

+0

Probablement une question stupide, mais comment puis-je définir les propriétés de l'instance sans le lancer? (comme je ne sais pas à quoi le lancer) – tardomatic

+0

@tardomatic: excellente question; Je l'ai édité dans la réponse comme vous l'avez posé :) –

+1

Petites améliorations: 'Non ... est Nothing' =>' ... IsNot Nothing'. - 'CType' =>' DirectCast' (dans ce cas). –

Questions connexes