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