ventajas usar tipos tipo runtimebinderexception runtimebinder puede programacion microsoft metodos invocar funciones eventos delegados delegado csharp concepto anonimos anonimas c# delegates action

c# - usar - tipos de delegates



Delegado de acción Cómo obtener la instancia que llama al método (2)

Creo que estás buscando la propiedad Delegate.Target .

EDITAR: Bien, ahora veo lo que buscas, y necesitas un árbol de expresiones que represente la acción. Luego puede encontrar el destino de la llamada al método como otro árbol de expresiones, crear una LambdaExpression a partir de eso, compilarla y ejecutarla, y ver el resultado:

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> 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); } }

Tenga en cuenta que esto es increíblemente frágil, pero debería funcionar en casos simples.

Tengo una Acción y me pregunto cómo podría acceder a la instancia que llama al método.

Ejemplo:

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" }

Gracias


En realidad, no sé si puedes hacerlo de esta manera. Delegate clase de Delegate contiene solo dos propiedades: Target y Method . El acceso a Target no funcionará porque está creando un nuevo método anónimo, por lo que la propiedad devolverá la clase en la que se FindInstance método FindInstance .

Pruebe algo como esto en su lugar:

FindInstance(this.MyInstance.DoSomething);

Y luego acceda a la propiedad Target siguiente manera:

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