10

Ich habe eine Klasse, die viele ähnliche, aber unterschiedliche Lese-/Schreiboperationen in einer Excel-Datei durchführt. Alle diese Operationen sind in separaten Funktionen definiert. Sie müssen alle in demselben langen Codeblock enthalten sein (Code, der eine Datei prüft und öffnet, speichert, schließt usw.). Was ist ein vernünftiger Weg, um diesen Code nicht jedes Mal duplizieren zu müssen? Das Problem ist, dass ich nicht nur eine Methode mit dem gesamten Code verwenden kann, bevor ich den Code für jede Methode ausführen, da dieser Code in vielen Schichten von If, versuchen und für Anweisungen des gemeinsamen Codes enthalten sein muss .Pass-Funktion als Parameter in vb.net?

Ist es möglich, eine Funktion als Parameter zu übergeben und diese Funktion dann innerhalb des gemeinsamen Codes auszuführen? Oder gibt es einen besseren Weg, damit umzugehen?

+0

mögliche Duplikate von [Wie übergeben Sie MethodName als Parameter einer Prozedur in VBNET] (http://stackoverflow.com/questions/8697504/how-to-pass-methodname-as-parameter-of-a-procedure- in-vbnet) – mbomb007

Antwort

3

Sie können auch eine delegate verwenden, damit Sie Funktionen/Subs mit einer bestimmten Signatur übergeben können.

3

Deklarieren Sie Ihren Parameter als Func(Of T) oder Action(Of T).

Welche Sie verwenden sollten, hängt von Ihrer Methodensignatur ab. Ich könnte Ihnen eine genauere Antwort geben, wenn Sie uns eine geben.

+0

Wenn ich als Func deklariere, bekomme ich den Fehler "Typ func ist nicht definiert". Wenn ich als Aktion deklariere, bekomme ich den Fehler "zu wenig Typ Argumente zu system.action (of T)". Einige der Methoden, die ich bestehen würde, sind Funktionen, einige von ihnen sind Subs. –

+0

Sie müssen die gleiche Signatur haben, um 'Func (Of T)' oder 'Action (Of T)' zu verwenden. – MarcinJuraszek

+1

Was bedeutet das? –

22

auf die eigentliche Frage Fokussierung:

Ist es möglich, eine Funktion als Parameter

Ja passieren. Verwenden Sie AddressOf TheMethod, um die Methode an eine andere Methode zu übergeben. Der Argumenttyp muss ein Delegat sein, dessen Signatur mit der der Zielmethode übereinstimmt. In der Methode behandeln Sie den Parameter so, als wäre es die tatsächliche Methode. Beispiel:

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) 

Wie gesagt, hängt der tatsächliche Parametertyp von der Signatur der Methode ab, die Sie übergeben möchten. Verwenden Sie entweder Action(Of T) oder Func(Of T) oder einen benutzerdefinierten Delegattyp.

In vielen Fällen ist es jedoch angemessen, eine Schnittstelle anstelle eines Delegaten zu verwenden, verschiedene Klassen implementieren Ihre Schnittstelle und übergeben Sie Objekte dieser verschiedenen Klassen in Ihre Methode.