Получение экземпляра, вызвавшего метод в C # - PullRequest
14 голосов
/ 10 февраля 2010

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

Например:

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();
        //...
    }

}

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

Ответы [ 5 ]

10 голосов
/ 02 декабря 2011

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

...
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();
        //...
    }
/*...*/
}

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

1 голос
/ 10 февраля 2010

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

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

0 голосов
/ 10 февраля 2010

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

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

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

0 голосов
/ 10 февраля 2010

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

public void Method(object callerObject)
{
..
}

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

myClass.Method(this);

С уважением, Флориан

0 голосов
/ 10 февраля 2010

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

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

Class1 c1 = new Class1(object1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...