AddressOf
私の望みは、特定の関数を 1 つの入力パラメーターを使用して名前で実行することFunction Foo(x as Integer) As Integer
です。再帰関数に必要な 2 つの入力は、関数名と、何らかの型 t (Integer、Double、List(Of Integer) など)_name As String
のオブジェクトです。_list As t
目標は、関数名を使用して要素または要素のリストを処理することです。これは、特定の関数でリストを処理する必要が何度もあり、各場所でリスト処理コードを複製したくないためです。完全にクラッシュしなかったこのタイプの関数(以下)で最善を尽くそうとした方法は、このエラーを引き起こしました:
警告: List.Test 操作に失敗しました。次の引数でパブリック 'ProcessList' を呼び出すことができないため、オーバーロードの解決に失敗しました: 'Public Shared Function ProcessList(Of t)(_func As Func(Of Object,t), _list As System.Object) As IEnumerable(Of t)':型引数の推論は、引数一致パラメーター '_func' で失敗します。
Iterator Function ProcessList(Of t)(_func As Func(Of Object, t), _list As Object) As IEnumerable(Of t)
If _list.GetType = GetType(List(Of t)) Then
Yield _list.SelectMany(Function(l) ProcessList(_func, l))
Else
Yield _func(_list)
End If
End Function
参考までに、必要なことを効果的に実行する Python コードのスニペットを見つけましたが、この方向 (Python から VB.net) への変換には少し慣れていません。 VB.net。Python スニペットは次のとおりです。
def ProcessList(_func, _list):
return map(lambda x: ProcessList(_func, x) if type(x)==list else _func(x), _list)
この関数を呼び出す方法、または私のアプローチに欠陥がある場合にこの関数を作り直す方法についての助けをいただければ幸いです。
アップデート:
メソッドが機能しているという@djvの情報に基づいて、関数の呼び出し方法と他のいくつかのことを再検討しました。まず、これらの関数とのインターフェイス方法の性質上、上記の関数を次のように公開する必要があります。
Public Shared Function Foo(ByVal _input As Object) As Object
Return Utilities.ProcessList(AddressOf Bar, _input)
End Function
また、次のエラー メッセージが表示されるようになりました。
警告: List.Test 操作に失敗しました。タイプ 'System.Int32' のオブジェクトをタイプ 'System.Collections.Generic.IList`1[System.Int32]' にキャストできません。
この時点での問題は、私が思っていた関数自体ではなく、おそらく ProcessList 関数を呼び出すメソッドにあります。ProcessList を単独で呼び出すことに満足していない GUI とやり取りしているため、この中間の「ヘルパー」関数が必要ですが、これは明らかに正しく使用されていません。