Получение экземпляра, который вызвал метод в С#
Я ищу алгоритм, который может получить объект, который вызвал метод, внутри этого метода.
Например:
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();
//...
}
}
Есть ли способ сделать это?
Ответы
Ответ 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);
Флориан