2010-04-14 1 views
0

У меня есть эта функция:роли массива в переменной Object, чтобы ввести переменную System.Type

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

End Sub 

«ценность» аргумент всегда является массив того же типа, как «типа». Как я могу перебирать значения массива?

Я хотел бы быть в состоянии сделать что-то вроде этого:

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 

Редактировать Хорошо, я думаю, что я буду добавлять больше деталей, так что вы можете увидеть, что я пытаюсь сделать. У меня есть объект, который фиксирует значения, возвращаемые с другой страницы. Как только я их захватил, я хочу перебрать свойство «Значения». Таким образом, для каждого словарного объекта в «Значениях» будет вызываться DoStuff() выше. Если значение в словаре objct является массивом, я хочу также пропустить его. Я сохранил тип, добавленный через общий вызов функции, как System.Type, но, возможно, это не путь. Как я могу написать это, чтобы впоследствии сохранить тип массива и цикл через массив?

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

Это не совсем возможно и не имеет абсолютно никакого смысла. Что ты пытаешься сделать? – SLaks

+0

Есть очень мало случаев, когда я когда-либо видел, где System.Type должен использоваться вне отражения. Еще до того, как у нас были дженерики, все еще были лучшие способы сделать то, что вы, вероятно, делаете. –

+0

Хорошо ... что это? – adam0101

ответ

2

Комментарии переехали ответы на OP

Ваш «сделать что-то» код в зависимости от типа я полагаю, String против Int против Apple, то ему необходимо будет обрабатывать все три типа с помощью оператора If. Просто включите перегруз для этих трех типов, вам фактически не нужно передавать информацию о типе. Однако, если его просто вызывает ToString(), просто используйте массив Object.

И если вам не нравятся перегрузки, просто используйте оператор TypeOf для проверки значений массива. Когда вы бросаете Integer в массив Object, его все еще Integer, просто в коробке.

0

Этот тип известен во время компиляции? Если да, возможно, вы могли бы использовать Generics.

+0

Я добавил более подробную информацию. Надеюсь, я понятнее. – adam0101

0

Вы можете предоставить Action, например:

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

Тогда вам просто необходим метод, который принимает один параметр для каждого из типов вы заботитесь о и знает, как привести объект к этому типу. Затем вызовите DoStuff(), проходящий в адресе этого метода. Вы могли бы даже использовать лямбду, если хотите.

Смежные вопросы