Come passare un metodo arbitrario (o delegato) come parametro per una funzione?

Devo essere in grado di passare un metodo arbitrario ad alcune funzioni myFunction :

 void myFunction(AnyFunc func) { ... } 

Dovrebbe essere ansible eseguirlo con altri metodi statici, di istanza, pubblici o privati ​​o anche delegati:

 myFunction(SomeClass.PublicStaticMethod); myFunction(SomeObject.PrivateInstanceMethod); myFunction(delegate(int x) { return 5*x; }); 

Il metodo passato può avere un numero qualsiasi di parametri e qualsiasi tipo di ritorno. Dovrebbe anche essere ansible conoscere il numero effettivo di parametri e i loro tipi in myFunction tramite riflessione. Quale sarebbe AnyFunc nella definizione myFunction per soddisfare tali requisiti? È accettabile avere diverse versioni sovraccaricate di myFunction .

Il tipo Delegate è il supertipo di tutti gli altri tipi di delegati:

 void myFunction(Delegate func) { ... } 

Quindi, func.Method ti darà un object MethodInfo che puoi usare per ispezionare il tipo di ritorno e i tipi di parametri.

Quando si chiama la funzione, è necessario specificare esplicitamente il tipo di delegato che si desidera creare:

 myFunction((Func) delegate (int x) { return 5 * x; }); 

Qualche idea su ciò che stai cercando di raggiungere ad un livello più alto sarebbe buona, poiché questo approccio potrebbe non rivelarsi ideale.

Avere il metodo accetta un Delegate , piuttosto che un delegato particolare:

 void myFunction(Delegate func) { }