2016-08-11 2 views
-1

Mein Ziel ist es, eine Methode als Parameter übergeben zu können, genau wie ein Aufruf in Javascript, aber ohne Angabe des Rückgabewertes oder der Funktionssignatur.C# eine Methode als Parameter übergeben, ohne eine Methodensignatur anzugeben

Zum Beispiel in javascript ich tun kann:

  • Funktion [Rückgabewert] Test() {}
  • :

    function test(fn()){ 
    fn(); 
    } 
    

    fn() in JavaScript kann auf jeden beliebigen Funktionstyp interpretiert werden

  • Funktion [leer] Test() {}
  • Funktion [...] (arg1, arg2 ...) {}

(Funktionsargumente überladen ist möglich ...)

C# bietet mir nicht viel mit "Action" und "Func".

In C# ich einen Delegaten erstellen und dann festlegen, welche Art von einem Delegierten ist:

  • Aktion: ein Delegierter auf eine Funktion, die void zurückgibt, die alle Funktionen der Aktion wird zeigen auf, haben um genau die gleiche Signatur zu enthalten (nicht cool ...)

  • Func: ein Delegat für eine Funktion, die einen Wert zurückgibt, alle Funktionen, auf die der Func zeigt, müssen dieselbe exakte Signatur enthalten (nicht cool. ..)

Die Verwendung eines Objekts bringt mich zu einer teuren Boxing/Unboxing Geschichte, die ich gerne vermeiden würde.

C# Experten, mit mir reden ..

+1

Ich denke, die Antwort ist "C# ist kein JavaScript" - C# ist keine dynamisch typisierte Skriptsprache, also versuchen Sie nicht, sie als eine zu verwenden. – CompuChip

+0

_Das Verwenden eines Objekts bringt mich zu einem teuren Boxen/Unboxing story_ : false. Wenn Sie ein Objekt verwenden, werden Sie möglicherweise gezwungen, das Objekt auf etwas Spezifischeres zu übertragen.Gießen und Boxen sind zwei völlig verschiedene Themen –

+2

Was ist das Problem, das Sie versuchen zu lösen? Ich meine, sobald Sie den Delegierten in Ihrer Methode haben, wie planen Sie, es zu nennen? – dasblinkenlight

Antwort

1

Ihre einzige wirkliche Option ist Objekt-Funktion (Object []) {}, aber wie Sie sagen, es gibt große Probleme mit der Interpretation des tatsächlichen Objekttyp. C# ist eine stark typisierte Sprache im Gegensatz zu JavaScript und daher sind die gewünschten Funktionen einfach nicht möglich. Wenn dies der Fall ist, sollten sie nicht verwendet werden, da Sie alle Vorteile einer stark typisierten Sprache verlieren .

+0

Ich fange an, das Gefühl zu bekommen, dass dies die einzige Option ist –

+0

@ USS-Montana yeah, es versucht wirklich etwas zu tun, das C# nicht entworfen wurde, so dass Sie Ich muss einen Vorschlaghammer verwenden, also Objekte, da alles von ihnen abstammt. Wenn Sie denken, dass dies der richtige Weg ist, können Sie das als Antwort akzeptieren? –

+0

Ich würde gerne etwas warten, vielleicht wird jemand mit einem neuen Ansatz uns faszinieren, wenn nicht, werde ich akzeptieren. –

2

Sie nennen es „nicht cool“, ich nenne es „type safe“ ....

Eine Lösung könnte die Art und Weise Sie die Methode aufrufen sein. Wenn dies die Methode möchten Sie anrufen:

public void Test(Action fn) 
{ 
    fn(); 
} 

Und das ist diejenige, die Sie weitergeben möchten:

public string MethodWithReturnType() 
{ 
    return "Hello World!"; 
} 

Dann können Sie mit Hilfe eines Lambda Test mit MethodWithReturnType nennen:

Test(() => MethodWithReturnType()); 
+0

Aber mit Aktion geben Sie die Signatur und den Rückgabewert an. –

Verwandte Themen