Hello all.

I succeeded in making something awesome: A thread execute plug-in!.
Basically it executes the given sub on a separate thread using delegates.
I also made a "Delegate Execute" plug-in to invoke a sub.

Thread Execute code Code:
  1. #Region "Thread Execute"
  2.     Public Delegate Sub DSparam0()
  3.     Public Delegate Sub DSparam1(ByVal Param1 As Object)
  4.     Public Delegate Sub DSparam2(ByVal Param1 As Object, ByVal Param2 As Object)
  5.     Public Delegate Sub DSparam3(ByVal Param1 As Object, ByVal Param2 As Object, ByVal Param3 As Object)
  6.     Public Delegate Sub DSparam4(ByVal Param1 As Object, ByVal Param2 As Object, ByVal Param3 As Object, ByVal Param4 As Object)
  7.     Public Delegate Sub DSparam5(ByVal Param1 As Object, ByVal Param2 As Object, ByVal Param3 As Object, ByVal Param4 As Object, ByVal Param5 As Object)
  8.     Private TData As New List(Of Object)
  9.     Public Sub ThreadExecute(ByVal Subname As DSparam0)
  10.         TExec(Subname, Nothing)
  11.     End Sub
  12.     Public Sub ThreadExecute(ByVal Subname As DSparam1, ByVal ParamArray Parameters() As Object)
  13.         TExec(Subname, Parameters)
  14.     End Sub
  15.     Public Sub ThreadExecute(ByVal Subname As DSparam2, ByVal ParamArray Parameters() As Object)
  16.         TExec(Subname, Parameters)
  17.     End Sub
  18.     Public Sub ThreadExecute(ByVal Subname As DSparam3, ByVal ParamArray Parameters() As Object)
  19.         TExec(Subname, Parameters)
  20.     End Sub
  21.     Public Sub ThreadExecute(ByVal Subname As DSparam4, ByVal ParamArray Parameters() As Object)
  22.         TExec(Subname, Parameters)
  23.     End Sub
  24.     Private Sub TExec(ByVal Deleg As Object, ByVal Parameters() As Object)
  25.         TData.Clear()
  26.         TData.Add(False)
  27.         TData.Add(Deleg)
  28.         If IsArray(Parameters) Then TData.AddRange(Parameters)
  29.         Dim t As New Threading.Thread(AddressOf EXECTHREAD)
  30.         t.IsBackground = True
  31.         t.Start()
  32.         Do While TData(0) = False
  33.             Threading.Thread.Sleep(100)
  34.         Loop
  35.     End Sub
  36.     Private Sub EXECTHREAD()
  37.         '0 = started
  38.         '1 = delegate
  39.         '2 - inf = parameters
  40.         TData(0) = True
  41.         If TData(1).GetType.Name = "DSparam0" Then CType(TData(1), DSparam0)()
  42.         If TData(1).GetType.Name = "DSparam1" Then CType(TData(1), DSparam1)(TData(2))
  43.         If TData(1).GetType.Name = "DSparam2" Then CType(TData(1), DSparam2)(TData(2), TData(3))
  44.         If TData(1).GetType.Name = "DSparam3" Then CType(TData(1), DSparam3)(TData(2), TData(3), TData(4))
  45.         If TData(1).GetType.Name = "DSparam4" Then CType(TData(1), DSparam4)(TData(2), TData(3), TData(4), TData(5))
  46.     End Sub
  47. #End Region

Now I want to decrease the coding size some more, and therefore my question:
How can I specify multiple types for a byval parameter in a sub?
At this point it overloads the other subs to get the desired amount of needed parameters. (max is 5 atm). I want to do this without overloading.

As example the following two subs:

Code:
    Public Sub ThreadExecute(ByVal Subname As DSparam1, ByVal ParamArray Parameters() As Object)
        TExec(Subname, Parameters)
    End Sub
    Public Sub ThreadExecute(ByVal Subname As DSparam2, ByVal ParamArray Parameters() As Object)
        TExec(Subname, Parameters)
    End Sub
I want to change that to, for example, this:

Code:
    Public Sub ThreadExecute(ByVal Subname As [DSparam1 or DSparam2], ByVal ParamArray Parameters() As Object)
        TExec(Subname, Parameters)
    End Sub
How can I do that?