Подтвердить что ты не робот

Получение экземпляра, который вызвал метод в С#

Я ищу алгоритм, который может получить объект, который вызвал метод, внутри этого метода.

Например:

public class Class1 {

    public void Method () {
        //the question
        object a = ...;//the object that called the method (in this case object1)
        //other instructions
    }

}

public class Class2 {

    public Class2 () {
        Class1 myClass1 = new Class1();
        myClass1.Method();
    }

    public static void Main () {
        Class2 object1 = new Class2();
        //...
    }

}

Есть ли способ сделать это?

4b9b3361

Ответ 1

Очевидно, я не знаю точных данных о вашей ситуации, но это действительно похоже на то, что вам нужно немного переосмыслить структуру.

Это можно легко сделать, если структурировано правильное наследование.

Рассмотрим изучение абстрактного класса и классов, которые наследуются от указанного абстрактного класса. Вы даже можете выполнить одно и то же с интерфейсами.

Ответ 2

Вот пример того, как это сделать...

...
using System.Diagnostics;
...

public class MyClass
{
/*...*/
    //default level of two, will be 2 levels up from the GetCaller function.
    private static string GetCaller(int level = 2)
    {
        var m = new StackTrace().GetFrame(level).GetMethod();

        // .Name is the name only, .FullName includes the namespace
        var className = m.DeclaringType.FullName;

        //the method/function name you are looking for.
        var methodName = m.Name;

        //returns a composite of the namespace, class and method name.
        return className + "->" + methodName;
    }

    public void DoSomething() {
        //get the name of the class/method that called me.
        var whoCalledMe = GetCaller();
        //...
    }
/*...*/
}

Проводя это, потому что мне потребовалось некоторое время, чтобы найти то, что я искал сам. Я использую его в некоторых статических методах регистрации...

Ответ 3

Вы можете перейти к текущей трассировке стека в коде и подойти к одному шагу. http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

Но как было сказано ниже, это даст вам метод и класс, вызывающий вас, но не экземпляр (если он есть, может быть статичным, конечно).

Ответ 4

Это был бы очень плохой стиль, так как

a), который разрушит инкапсуляцию
б) невозможно узнать тип вызывающего объекта во время компиляции, так что, что бы вы ни делали с объектом позже, он будет неработоспособным.
c) было бы проще/лучше, если бы вы просто передали объект конструктору или методу, например:

Class1 c1 = new Class1(object1);

Ответ 5

или просто передать объект в качестве параметра метода.

public void Method(object callerObject)
{
..
}

и вызовите метод:

myClass.Method(this);

Флориан