Principalmente è utile che i delegati C# memorizzino già l'oggetto insieme alla funzione membro. Ma c'è un modo, per memorizzare - e passare come parametri - solo la funzione membro stessa, proprio come la buona vecchia funzione pointer-to-member in C++?Passare intorno alle funzioni membro in C#
Nel caso in cui la descrizione sia meno chiara, fornisco un esempio autonomo. E, sì, nell'esempio l'insistenza a passare le funzioni dei membri è totalmente inutile, ma ho degli usi più seri per questo.
class Foo {
public int i { get; set; }
/* Can this be done?
public static int Apply (Foo obj, ???? method, int j) {
return obj.method (j);
}
*/
public static int ApplyHack (Foo obj, Func<int, int> method, int j) {
return (int) method.Method.Invoke (obj, new object [] { j });
}
public static readonly Foo _ = new Foo(); // dummy object for ApplyHack
public int Multiply (int j) {
return i * j;
}
public int Add (int j) {
return i + j;
}
}
class Program {
static void Main (string [] args) {
var foo = new Foo { i = 7 };
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Multiply, 5));
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Add, 5));
Console.ReadKey();
}
}
Vedete, l'unica soluzione che ho trovato è piuttosto brutto e probabilmente lento.
Sicuramente più pulito ... tuttavia, se hai già il delegato, non hai bisogno del metodo 'ApplyHack' chiamarlo – cdhowie
D'accordo, ma poiché la domanda suggerisce che c'è più di questo problema rispetto a quanto mostrato nell'esempio, ho cercato di mantenere la mia risposta simile. – Zooba
Si noti che è anche possibile rinominare "Moltiplicare" su "Operatore *" per sovraccaricare l'operatore se ciò è più utile per voi. – Zooba