Delegato all’azione Come ottenere l’istanza che chiama il metodo

Ho un’azione e mi chiedo come potrei accedere all’istanza che chiama il metodo.

Esempio:

this.FindInstance(() => this.InstanceOfAClass.Method()); this.FindInstance(() => this.InstanceOfAClass2.Method()); this.FindInstance(() => this.InstanceOfAClass3.Method()); public void FindInstance(Action action) { // The action is this.InstanceOfAClass.Method(); and I want to get the "Instance" // from "action" } 

Grazie

Penso che tu stia cercando la proprietà Delegate.Target .

EDIT: Okay, ora vedo cosa cerchi, e hai bisogno di un albero delle espressioni che rappresenti l’azione. Quindi puoi trovare l’objective della chiamata al metodo come un altro albero di espressioni, creare una LambdaExpression, compilarla ed eseguirla e vedere il risultato:

 using System; using System.Linq.Expressions; class Test { static string someValue; static void Main() { someValue = "target value"; DisplayCallTarget(() => someValue.Replace("x", "y")); } static void DisplayCallTarget(Expression action) { // TODO: *Lots* of validation MethodCallExpression call = (MethodCallExpression) action.Body; LambdaExpression targetOnly = Expression.Lambda(call.Object, null); Delegate compiled = targetOnly.Compile(); object result = compiled.DynamicInvoke(null); Console.WriteLine(result); } } 

Si noti che questo è incredibilmente fragile, ma dovrebbe funzionare in casi semplici.

In realtà non so se puoi farlo in questo modo. Delegate class Delegate contiene solo due proprietà: Target e Method . L’accesso a Target non funzionerà perché stai creando un nuovo metodo anonimo, quindi la proprietà restituirà la class in cui viene chiamato il metodo FindInstance .

Prova invece qualcosa del genere:

 FindInstance(this.MyInstance.DoSomething); 

E quindi accedere alla proprietà Target come segue:

 public void FindInstance(Action action) { dynamic instance = action.Target; Console.WriteLine(instance.Property1); }