2010-04-14 7 views
0

J'ai cette fonction:tableau Cast dans la variable d'objet à saisir System.Type variables

Public Sub DoStuff(ByVal type as System.Type, ByVal value as Object) 

End Sub 

L'argument de la 'valeur' ​​est toujours un tableau du même type que le 'type'. Comment puis-je faire défiler les valeurs du tableau?

Je voudrais pouvoir faire quelque chose comme ceci:

DoStuff(GetType(Integer), New Integer(){1,2,3}) 

Public Sub DoStuff(ByVal type as System.Type, ByVal value as Object) 

    //Strongly types arr as Integer() 
    Dim arr = SomeCast(type, value) 

    For Each i in arr 
     //Do something with i 
    Next 

End Sub 

Modifier Ok, je pense que je vais ajouter plus de détails afin que vous puissiez voir ce que je suis en train de faire. J'ai un objet qui capture les valeurs revenant d'une autre page. Une fois que je les ai capturés, je veux parcourir la propriété 'Values'. Donc DoStuff() ci-dessus serait appelé pour chaque objet dictionnaire dans 'Valeurs'. Si la valeur dans le dictionnaire objct est un tableau, je veux également faire une boucle. Je sauvais le type ajouté par l'appel de fonction générique en tant que System.Type, mais peut-être que ce n'est pas la voie à suivre. Comment puis-je écrire ceci afin que je puisse sauvegarder le type du tableau et faire une boucle dans le tableau plus tard?

Public Class PopUpReturnValues 
    Implements IPopUpReturnValues 

    Public Sub AddValue(Of T As Structure)(ByVal name As String, ByVal value As T) Implements IPopUpReturnValues.AddValue 
     _values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(T), .Value = value, .IsArray = False}) 
    End Sub 

    Public Sub AddArray(Of T As Structure)(ByVal name As String, ByVal values As T()) Implements IPopUpReturnValues.AddArray 
     _values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(T), .Value = values, .IsArray = True}) 
    End Sub 

    Public Sub AddStringValue(ByVal name As String, ByVal value As String) Implements IPopUpReturnValues.AddStringValue 
     _values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(String), .Value = value, .IsArray = False}) 
    End Sub 

    Public Sub AddStringArray(ByVal name As String, ByVal values As String()) Implements IPopUpReturnValues.AddStringArray 
     _values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(String), .Value = values, .IsArray = True}) 
    End Sub 

    Private _values As New Dictionary(Of String, PopUpReturnValue) 
    Public ReadOnly Property Values() As IDictionary(Of String, PopUpReturnValue) 
     Get 
      Return _values 
     End Get 
    End Property 

    Public Class PopUpReturnValue 
     Public UnderlyingType As Type 
     Public Value As Object 
     Public IsArray As Boolean 
    End Class 

End Class 
+0

Ce n'est pas complètement possible et cela n'a pas vraiment de sens. Qu'essayez-vous de faire? – SLaks

+0

Il y a très peu de cas que j'ai jamais vu où System.Type devrait jamais être utilisé en dehors de la réflexion. Même avant que nous ayons des génériques, il y avait encore de meilleures façons de faire ce que vous faites probablement. –

+0

Ok ... qu'est-ce qu'ils sont? – adam0101

Répondre

2

Commentaires déplacés aux réponses par OP

Votre code « faire quelque chose » en fonction du type je suppose, String vs Int vs Apple, il serait nécessaire de gérer les trois types avec une instruction If. Il suffit d'inclure une surcharge pour ces trois types, vous n'avez pas besoin de transmettre les informations de type. Cependant, si elle appelle simplement ToString(), utilisez simplement un tableau Object.

Et si vous n'aimez pas les surcharges, utilisez simplement l'opérateur TypeOf pour inspecter les valeurs de la matrice. Lorsque vous lancez un entier dans un tableau d'objets, c'est toujours un entier, juste un entier.

0

Le type est-il connu au moment de la compilation? Si oui, peut-être pourriez-vous utiliser Generics.

+0

J'ai ajouté plus de détails à la question. J'espère que je suis plus clair. – adam0101

0

Vous pouvez fournir un Action, comme ceci:

Public Sub DoStuff(ByVal value As Array, ByVal process As Action(Of Object)) 
    For Each item In value 
     process(item) 
    Next item 
End Sub 

Ensuite, vous avez juste besoin d'une méthode qui prend un paramètre pour chacun des types qui vous passionnent et sait comment jeter objet à ce type. Puis appelez le DoStuff() en passant l'adresse de cette méthode. Vous pourriez même utiliser un lambda si vous le vouliez.