Func<> mit einer unbekannten Anzahl von Parametern
Betrachten Sie den folgenden pseudo-code:
TResult Foo<TResult>(Func<T1, T2,...,Tn, TResult> f, params object[] args)
{
TResult result = f(args);
return result;
}
Die Funktion akzeptiert Func<>
mit unbekannter Anzahl der generischen Parameter, eine Liste der entsprechenden Argumente. Ist es möglich, dies in C# schreiben? Wie definieren und aufrufen Foo
? Wie gebe ich args
zu f
?
- Leider nicht möglich 🙁 Sie können es über
Delegate
und mit der spiegelung, aber ich bin sicher, das ist nicht, was Sie wollen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht möglich ist. Am besten, Sie hätte einen Delegaten, der braucht auch eine variable Anzahl von Argumenten, und dann haben die Delegierten Parsen der Argumente
Können Sie
Delegate
mitDynamicInvoke
.Mit, dass Sie nicht brauchen, um Griff mit
object[]
imf
.Verwendung:
Erstellte ich ein Turnschuh zeigt einige Beispiele: https://dotnetfiddle.net/LdmOqo
Hinweis:
Wenn Sie möchten, verwenden Sie eine
method group
, müssen Sie eine explizite Umwandlung in denFunc
:Fiddle: https://dotnetfiddle.net/3ZPLsY
DynamicInvoke
reflektieren das Array durch Komma getrennte Parameter in den Methoden der Ausführung?DynamicInvoke
macht genau das. In diese Geige zeige ich einige Beispiele. Überprüfen msdn-doc - DynamicInvoke für mehr Informationen.bool F(string name, int age, bool active) {...}
können nicht direkt übergeben werden, umFoo<bool>(F, "Jon",40,true)
.Method("yoyo", 22)
jeden Fall false zurückgibt! 😉Könnte dies einfach mit lambda-Ausdrücken:
Dann Verwendung coul werden wie:
Wo
method
kann beliebige Methode der Rückkehrint
.Diese Weise können Sie eine beliebige Anzahl von erguments direkt über lambda.
Könnten Sie versuchen, etwas ähnlich zu dem, was ich hier gepostet: https://stackoverflow.com/a/47556051/4681344
Wird es ermöglichen, für eine beliebige Anzahl von Argumenten und erzwingt Ihre Typen.
nennen, es ist einfach......
ParamsFunc<>
statt, aber sonst kann ich Zustimmen. Ich würde es machen kovariante ("out
") inT
. Zum Beispielpublic delegate TResult ParamsFunc<out TResult>(params object[] args);
In einigen Fällen können Sie in der Lage sein, um Weg mit einem trick, wie diese: