TL; DR
私は次のいずれかの方法を探しています:
Action
をとるをParamArray
作成しますObject
Expression
指定された数/タイプのジェネリックパラメーターに一致するアクションを作成するために使用します
詳細
非同期呼び出しをブロッキング呼び出しに変える関数を書いています。私の関数は、実行するタスク、タイムアウト値、およびStates
結果として発生する可能性のある(イベントのようなもの)のコレクションを取ります。States
複数のジェネリックパラメーターIState(of T)、IState(of T1、T2)などを定義しました。
Function MakeBlocking(task As Action,
resultingStates As IEnumberable(of IState),
Optional ByVal millisecondsTimeout As Integer = -1)
As Boolean
Dim are As New AutoResetEvent(False)
Dim onFinish As New Action(Sub() are.Set())
For Each state In resultingStates
state.Subscribe(onFinish)
Next
task.Invoke()
Dim result = are.WaitOne(millisecondsTimeout)
For Each state In resultingStates
state.Unsubscribe(onFinish)
Next
Return result
End Function
任意の数とタイプのパラメーターを持つIStateのコレクションを受け入れられるようにしたいと思います。IState(Of T)
から継承しIState
、からIState(Of T1, T2)
継承するので、うまくいくIState(Of T)
と思いますIEnumerable(Of IState)
。問題は、Action
私がそれらをサブスクライブしているのに、一致するパラメーターがないことです。
Public Interface IState(Of T1, T2)
Inherits IState(Of T1)
Shadows Function Subscribe(ByVal action As Action(Of T1, T2)) As IStateSubscription
Shadows Function Unsubscribe(ByVal action As Action(Of T1, T2)) As Boolean
End Interface
ご覧のとおり、結果として、、、の状態が発生した場合は、それぞれに個別の状態が必要にIState(Of String, Boolean)
なりIState(Of Integer)
ます。私は本当にこのようなことをしたいと思っています:IState(Of String)
Action
Dim onFinish As New Action(Sub(ParamArray stuff As Object())(Sub() are.Set())
しかし、それを行うための検証構文が見つからないようです(可能であれば)。他の唯一のオプションは、Expression.Lambdaを使用してサブスクライブできるメソッドを動的に作成することのようですが、これまで式ツリーの経験はあまりありませんでした。アクションExpression
からを作成する方法はありますか?OnFinish
州を扱っている図書館は私の管理外であることに注意する必要があります。基になるコードは、パラメーターの数と割り当て可能性(つまり、IsAssignableFrom)が一致することを確認します。したがって、すべてをとして渡してもIState
、基になる型が実際に何であるかを調べて、サブスクライブできないことを通知Action
します。そのState
。