Action delegate. How to get the instance that call the method

橙三吉。 提交于 2019-12-23 07:27:36

问题


I have an Action and I wonder how could I access the instance that call the method.

Exemple:

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

Thank you


回答1:


I think you're looking for the Delegate.Target property.

EDIT: Okay, now I see what you're after, and you need an expression tree representing the action. Then you can find the target of the method call as another expression tree, build a LambdaExpression from that, compile and execute it, and see the result:

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

Note that this is incredibly brittle - but it should work in simple cases.




回答2:


Actually I don't know if you can do it in this way. Delegate class contains only two properties: Target and Method. Accessing Target won't work because you are creating a new anonymous method, so the property will return the class in which FindInstance method is called.

Try something like this instead:

FindInstance(this.MyInstance.DoSomething);

And then access the Target property as follows:

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


来源:https://stackoverflow.com/questions/5409580/action-delegate-how-to-get-the-instance-that-call-the-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!