2013-10-21 30 views
10

私は、Excelファイルに類似しているが異なる多くの読み書き操作を実行するクラスを持っています。 これらの操作はすべて別々の機能で定義されています。それらはすべて同じ長いコードブロック(ファイルのチェックとオープン、保存、クローズなど)に含まれていなければなりません。どのような合理的な方法は、毎回このコードを複製する必要はありません? 問題は、メソッドごとに異なるコードを実行する前に、共有コードのif、try、およびforステートメントの多くのレイヤーにコードを含める必要があるため、すべての共有コードを含むメソッドを1つしか使用できないということです。関数をvb.netのパラメータとして渡しますか?

関数をパラメータとして渡して、その関数を共有コード内で実行することはできますか?または、これを処理するより良い方法はありますか?

+0

[VBNETでプロシージャのパラメータとしてMethodNameを渡す方法]の複製可能性(http://stackoverflow.com/questions/8697504/how-to-pass-methodname-as-parameter-of-a-procedure- in-vnet) – mbomb007

答えて

3

delegateを使用して、特定の署名を持つ関数/ subsを渡すこともできます。

3

パラメータをFunc(Of T)またはAction(Of T)と宣言してください。

どちらを使用するかは、メソッドのシグネチャによって異なります。あなたが私たちに与えてくれればもっと正確な答えを与えることができます。実際の問題に焦点を当て

+0

Funcとして宣言すると、 "type func is not defined"というエラーが出ます。私がActionとして宣言すると、「(Tの)system.actionへの少数の型引数へのエラー」が出ます。私が渡すメソッドのいくつかは関数であり、そのうちのいくつかはsubsです。 –

+0

彼らは 'Func(Of T)'か 'Action(Of T)'のどちらかを使うために同じ署名を持たなければなりません。 – MarcinJuraszek

+1

それはどういう意味ですか? –

22

は、パラメータ

はいとしての機能を通過させることが可能です。メソッドを別のメソッドに渡すには、AddressOf TheMethodを使用します。引数の型は、ターゲットメソッドのシグネチャと一致するシグネチャを持つデリゲートでなければなりません。メソッドの内部では、パラメータを実際のメソッドのように扱います。例:

Sub Foo() 
    Console.WriteLine("Foo!") 
End Sub 

Sub Bar() 
    Console.WriteLine("Bar!") 
End Sub 

Sub CallSomething(f As Action) 
    f() 
End Sub 

' … somewhere: 
CallSomething(AddressOf Foo) 
CallSomething(AddressOf Bar) 

実際のパラメータのタイプは、渡すメソッドのシグネチャによって異なります。 Action(Of T)またはFunc(Of T)またはカスタムデリゲートタイプのいずれかを使用します。

しかし、多くの場合、デリゲートではなくインターフェイスを使用し、異なるクラスでインターフェイスを実装し、それらの異なるクラスのオブジェクトをメソッドに渡すのが適切です。

関連する問題